1. 程式人生 > >python3 django models儲存filefiled欄位統一目錄、不修改檔名的方法

python3 django models儲存filefiled欄位統一目錄、不修改檔名的方法

最經編寫一個model時處理filefiled,使用post_form.save()進行新增和編輯檔案儲存位置不統一,如果出現重複檔名重複的話,上傳檔名會被改名。

現有程式碼如下:

models.py

class Wechat_Pubno(models.Model):
    name = models.CharField(verbose_name='名稱*' , max_length=30 , blank=False , unique=True)
    qr_code = models.ImageField(verbose_name='二維碼', upload_to='upload/basicdata/wechat_pubno')
   def __str__(self):
    return self.name

forms.py
class Forms_Wechat_Pubno(forms.ModelForm):
    def __init__(self , *args , **kwargs):
        super(Forms_Wechat_Pubno , self).__init__(*args, **kwargs)
        self.fields['qr_code'].required = False

    class Meta :
        model = Wechat_Pubno
        fields = '__all__'

views.py
def add(request):
    if request.method == 'POST':
        post_form = forms(request.POST,request.FILES)
        if post_form.is_valid():
            post_form.save()
            #配合post_form = forms(request.POST,request.FILES),web頁面上傳檔案正常儲存,而且不會重複
            return HttpResponseRedirect(reverse('list_' + self.model_name))
        else :
            errors_message = post_form.errors
            write_log('warning' , op_user, model_cnname + '新增失敗' + str(post_form) + ',原因如下:\n' + str(errors_message))
            return render(request, 'result.html', {'error_message': str(errors_message)})
    else :
        get_form = forms()
        request_dict = {'title_name' : title_name , 'get_form': get_form} 
        return render(request, 'add_edit.html', request_dict)

改進views.py
def add(request):
    if request.method == 'POST':
        post_form = forms(request.POST,request.FILES)
        if post_form.is_valid():
        # 這段程式碼完全是為了處理filefiled,如果不需要使用filefiled的話,直接post_form.save()
            media_dir = MEDIA_ROOT.replace(BASE_DIR + '/', '')
            new_value = {}
            for key in detail_field_list :
            # 處理filefield
                try :
                    if key in filefield_dict :
                        filename = key + '_' + str(request.FILES[key])
                        # 檔名,欄位名+上傳檔名
                        file = request.FILES[key]
                        upload_dir = MEDIA_ROOT + '/upload/' + app_name + '/' + model_name + '/' + request.POST.get('name') + '/'
                        # 上傳目錄,MEDIA_ROOT/upload/app名/modles名/欄位name的值/
                                
                        from library.webpage import uploadfile
                        fullfilename = uploadfile(file, filename, upload_dir)
                        # 最終目錄為MEDIA_ROOT.replace(BASE_DIR,'')/upload/app名/modles名/欄位name的值/欄位名_上傳檔名,防止出現重複替換操作
                        value = media_dir + '/upload/' + app_name + '/' + model_name + '/' + request.POST.get('name') + '/' + filename
                        # 資料庫中寫相對路徑
                    else :
                        value = request.POST.get(key)
                except :
                    value = request.POST.get(key)
                    
                # 日期轉換
                if re.search('^[0-9][0-9][0-9][0-9]/[0-1][0-9]', str(value)) :
                    from library.handle_datetime import date_convert
                    new_value[key] = date_convert(value , '%Y-%m-%d')
                else:
                    new_value[key] = value
    
            try :
                import_models.objects.create(**new_value)
            except Exception as e :
                print('新增資料失敗,' + str(new_value) + ',原因如下:\n' + str(e))

            return HttpResponseRedirect(reverse('list_' + model_name))
        else :
            ......
    else :
        ......

edit函式類似

這樣的話,可以統一,便於展示頁面展示圖片

相關推薦

python3 django models儲存filefiled統一目錄修改檔名方法

最經編寫一個model時處理filefiled,使用post_form.save()進行新增和編輯檔案儲存位置不統一,如果出現重複檔名重複的話,上傳檔名會被改名。 現有程式碼如下: models.py

Django Field lookups (查詢)

欄位查詢是指定SQL WHERE子句的核心內容的方式。 它們被指定為QuerySet方法filter()、exclude()和get()的關鍵字引數。 1、exact:精確查詢。如果為比較提供的值為None,則會將其解釋為SQL NULL   在MySQL中,資料庫表的“排序”設定決定了精確的比較是否區

django淺談 過濾內容

views.py class ConsultRecordModelForm(forms.ModelForm): class Meta: model = ConsultRecord # fields = "__all__" exclude=['delet

獲取Django model中的名和的verbose_name

定義模型:  class Game(models.Model): name = models.CharField(u'遊戲名稱',max_length=30) gameid = models.CharField(u'遊戲id',max_length=20)

django 擴充套件user使用者inlines

model: class Profile(models.Model): user = models.OneToOneField(User, on_delete=models.CASCADE, verbose_name='暱稱') nickname = models.CharF

Django 資料操作之與引數

Field 點選這裡檢視Github,記得關注哦! 資料操作欄位與其引數 欄位 所有欄位型別: AutoField(Field) int 自增列,必須填入引數 primary_key=True BigAutoField(AutoField) bigint 自增

SQL SERVER 統一補0方法

在SQL SERVER 2008R2的[AdventureWorks2008R2]示例資料庫中,看到以下欄位統一補0方法。 將CustomerID前面加0轉變為AccountNumber欄位。 CREATE TABLE [Sales].[Customer]( [CustomerID] [int] IDEN

models中,引數limit_choices_to的用法

這裡,在使用 ModelForm 渲染前端頁面的前提下,對於 models 中的 ManyToManyField 型別欄位會在 ModelForm 中被轉化為 ModelMultipleChoiceField 型別欄位,對於 models 中的 ForeignKey 型別欄位會在 ModelFo

Spring mvc整合Mybatis,選擇性儲存物件資料

前言 我們平時使用mybatis儲存物件資料時,經常可能只是修改其中某一倆個欄位的值,這個時候,我們為了減少資料庫更新帶來的效能、行鎖等不必要的消耗,可能會重新寫一個介面,只負責修改需要修改的值。 但是,隨著業務系統的變更,業務欄位的增加,越來越多的欄位需要

Django模型層之查詢引數及聚合函式

該系列教程繫個人原創,並完整發布在個人官網劉江的部落格和教程 所有轉載本文者,需在頂部顯著位置註明原作者及www.liujiangblog.com官網地址。 欄位查詢是指如何指定SQL WHERE子句的內容。它們用作QuerySet的filter(), exclude()和get()方法的關鍵字引數。 預設

Django】orm指定名,表名

1.指定欄位名: 在定義欄位的時候,增加引數db_column=’real_field’; 2.指定表名: 在model的class中,新增Meta類,在Meta類中指定表名db_table 例如在某個

Django Serializer HiddenField隱藏

Django rest_framework serializer.HiddenField(default=serializer.CurrentUser()) 在用Dajngo RestFrame

hibernate儲存blob時出錯 ORA-01465: 無效的十六進制數字

14:42:22,376  WARN JDBCExceptionReporter:100 - SQL Error: 1465, SQLState: 72000 14:42:22,377 ERROR JDBCExceptionReporter:101 - ORA-01465:

django模型中的和model名顯示為中文

簡單方法: models.py class IceCreamBar(models.Model): title = models.CharField(max_length=200,db_index=True,verbose_name="名稱")

mysql group_concat 分組,多統一排序及輸出資料到java

本文不涉及mysql的配置,bean的建立和使用,資料庫連線等教程,僅介紹group_concat輸出到java 假設我們有如下資料 目標:輸出goodsId為1002,已顏色分組的資料。 首先編輯一下sql語句 String sql ="SEL

django獲取某一個的列表,values/values_list/flat

class Building(models.Model): corporation = models.ForeignKey('company.Corporation', verbose_name=u'學校', related_name='buildings')

PostgreSQL之日期統一加一天

開心一笑 高考穿衣注意事項:第一天穿紅色(開門紅),下午穿綠色(一路綠燈),第二天穿灰色和黃色(走向輝煌)。送考的媽媽要穿旗袍(旗開得勝),旗袍開叉要高(分高),送考的爸爸要穿馬褂(馬到成功)。考生一定穿紫內褲,寓意紫腚贏。再有,考生拿到試卷以後不要慌,先親一

Django 資料模型的列表整理

一個模型最重要也是唯一必需的部分,是它定義的資料庫欄位。 欄位名稱限制: 1.一個欄位名不能是一個Python保留字,因為那樣會導致一個Python語法錯誤。 2.一個欄位名不能包含連續的一個以上的下劃線,因為那是Django查詢語句的語法。欄位 列表縱

MySQL儲存區分大小寫的,你知道嗎?

做一個積極的人 編碼、改bug、提升自己 我有一個樂園,面向程式設計,春暖花開! 00 簡單回顧 之前寫過一篇關於mysql 對錶大小寫敏感的問題,其實在mysql中欄位儲存的內容是不區分大小寫的,本篇進行簡單的總結。 想回顧一下: MySQL在Linux下資料庫名、表名、列名、別名

Django常用及引數事務資料庫查詢優化

常用欄位 注意: Django中沒有設定對應char型別的欄位,但可以支援自己定義。 自定義對應於資料庫的char型別欄位: from django.db.models import Field class RealCharField(Field): ''' 自定義的char型別欄位