未分配 Django 默认值!姜戈 1.11 python 3.6

Django default value not being assigned! django 1.11 python 3.6

我一直在寻找解决此问题的方法。我有一个名为 'Album' 的模型,如果未手动指定,则需要为某些字段分配默认值。经过所有研究,感觉我所有的代码都是正确的,但没有分配默认值。另外,这是我第一次在 Whosebug 上发帖提问,所以请多多包涵我的新手。以下是所有代码:

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__'

如果表单中的 'artist'、'album_title' 和 'dt_field' 这些字段留空,则应将默认值分配给这些字段。 None 个字段被分配了默认值,除非手动初始化,否则它们将保持为空。

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"

此外,如果这种方法不正确,正确的方法是什么?

那是因为您的模型允许 blank=True,所以 Django 没有理由分配默认值。如果您希望您的模型在未指定时始终包含默认值,请不要将您的字段设置为 blank=True。另外,不要在 CharField 上使用 null=True,因为这将允许在数据库中有两个 empty 表示。所以你有两个选择:

  1. 更改模型:

    artist = models.CharField(max_length=250, default="some_default_artist_name")
    
  2. 在表单验证期间分配默认值:

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

另见 this SO question

编辑:(已解决)

因此,由于一些奇怪的未知原因,默认参数不起作用,但 的回复确实启发了我采用与我之前所遵循的不同的方法。

所以,对于那些陷入与我类似情况的人来说,这是新的工作代码:

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)

此外,我们随时欢迎您提出任何建议或反馈。谢谢 :)