0

私はこの問題の解決策を見つけることができません。手動で指定しなければ、特定のフィールドにデフォルト値を割り当てる必要がある、「アルバム」というモデルがあります。すべての研究の後、私のコードはすべて正しいと感じますが、デフォルト値は割り当てられていません。また、これは私の初めてのstackoverflowの質問を投稿していますので、私の初心者にもご負担ください。Djangoのデフォルト値が割り当てられていません! django 1.11 python 3.6

models.pyファイル:

class Album(models.Model): 
    artist = models.CharField(max_length = 250, blank = True, null = True, default = "some_default_artist_name") 
    album_title = models.CharField(max_length = 500, default='some_default_album_name', blank = True, null = True) 
    genre = models.CharField(max_length = 100) 
    album_logo = models.FileField() 
    date_field = models.DateField() 
    dt_field = models.DateField(blank = True, null = True, default=date.today().strftime('%d/%m/%Y')) 

forms.pyファイル:

class AlbumForm(forms.ModelForm): 
    artist = forms.CharField(required = False) 
    album_title = forms.CharField(required = False) 
    genre = forms.CharField() 
    album_logo = forms.FileField() 
    date_field = forms.DateField(widget = forms.DateInput(attrs={'placeholder': 'dd/mm/yyyy'}, format='%d/%m/%Y')) 
    dt_field = forms.DateField(required = False, widget = forms.DateInput(attrs={'placeholder': 'dd/mm/yyyy'}, format='%d/%m/%Y')) 

    class Meta: 
     model = Album 
     fields = '__all__' 

デフォルト値が 'アーティスト'、 'ALBUM_TITLE' に割り当てられることが期待されているここで、すべてのコードですこれらのフィールドが空白のままの場合は 'dt_field'になります。実際に初期化されていない限り、フィールドにはデフォルト値が割り当てられず、nullのままです。

views.py:

class AlbumCreate(LoginRequiredMixin, SuccessMessageMixin, CreateView): 
    login_url = 'music:login' 
    form_class = AlbumForm 
    redirect_field_name = None 
    #fields = '__all__' 
    model = Album 
    success_message = "Album was created successfully" 

このアプローチが正しくない場合にも、何が正しいアプローチかもしれません?

答えて

0

EDIT:(解決)

ので、デフォルトのパラメータがうまく動作しないいくつかの奇妙な未知の理由が、私は以前、次のされたものとは異なるアプローチを追跡するために私を鼓舞したのdirkgrotenによって返信用。

だから、ここは私のように似たような状況で立ち往生したもののための新しい作業コードです:

models.py:(すべての不要な偶然にを削除)

class Album(models.Model): 
    artist = models.CharField(max_length = 250) 
    album_title = models.CharField(max_length = 500) 
    genre = models.CharField(max_length = 100) 
    album_logo = models.FileField() 
    date_field = models.DateField() 
    dt_field = models.DateField() 

forms.py:(変更なし)

class AlbumForm(forms.ModelForm): 
    artist = forms.CharField(required = False) 
    album_title = forms.CharField(required = False) 
    genre = forms.CharField() 
    album_logo = forms.FileField() 
    date_field = forms.DateField(widget = forms.DateInput(attrs={'placeholder': 'dd/mm/yyyy'}, format='%d/%m/%Y')) 
    dt_field = forms.DateField(required = False, widget = forms.DateInput(attrs={'placeholder': 'dd/mm/yyyy'}, format='%d/%m/%Y')) 

    class Meta: 
     model = Album 
     fields = '__all__' 

、最終的にviews.py:(

)CREATEVIEWからdef_validメソッドをオーバーライド
class AlbumCreate(LoginRequiredMixin, SuccessMessageMixin, CreateView): 
    login_url = 'music:login' 
    model = Album 
    form_class = AlbumForm 
    redirect_field_name = None  
    success_message = "Album was created successfully" 

    def date_in_range(self, x): #basic function to check if a date is within a date range. Returns True if date is within the date range else false. 
     start = date(2000, 12, 31) 
     end = date(2017, 12, 31) 
     if start <= end: 
      return start <= x <= end 
     else: 
      return start <= x or x <= end 


    def form_valid(self, form): 
     obj = form.save(commit = False) 
     if not obj.artist: #if artist field left blank, assign this value 
      obj.artist = 'Default_artist_name' 
     if not obj.dt_field: #if dt_field left blank, assign this value 
      obj.dt_field = date.today() 
     if not self.date_in_range(obj.dt_field): #if entered date is not in range, then display a field error for dt_field. 
      form.add_error('dt_field', 'Date out of range') 
      return super(AlbumCreate, self).form_invalid(form) 
     self.object = form.save() 
     return super(AlbumCreate, self).form_valid(form) 

また、ご意見やご意見はいつでも歓迎します。タックス:

1

あなたのモデルではblank=Trueが許されているので、Djangoにデフォルト値を割り当てる必要はありません。指定しない場合にモデルに常にデフォルト値が含まれるようにするには、フィールドをblank=Trueに設定しないでください。また、CharFieldにはnull=Trueを使用しないでください。これにより、データベース内に2つのが表示されます。

  1. 変更モデル::

    artist = models.CharField(max_length=250, default="some_default_artist_name") 
    
  2. は、フォームの検証時にデフォルト値を割り当てます。また、this SO question

    def clean_artist(self): 
         if not self.cleaned_data.get('artist'): 
          cleaned_data['artist'] = "default_artist_name" 
    

参照だから、2つのオプションがあります。

関連する問題