未分配 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 表示。所以你有两个选择:
更改模型:
artist = models.CharField(max_length=250, default="some_default_artist_name")
在表单验证期间分配默认值:
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)
此外,我们随时欢迎您提出任何建议或反馈。谢谢 :)
我一直在寻找解决此问题的方法。我有一个名为 '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 表示。所以你有两个选择:
更改模型:
artist = models.CharField(max_length=250, default="some_default_artist_name")
在表单验证期间分配默认值:
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)
此外,我们随时欢迎您提出任何建议或反馈。谢谢 :)