【发布时间】:2019-04-23 13:55:05
【问题描述】:
为此,我已经尝试了在 Stack Overflow 上可以找到的所有不同示例和方法,但无论出于何种原因,都无法使其正常工作。
所以在我的 admin.py 中,我有一个 UserForm 和一个 UserAdmin。根据在表单中检查布尔值的条件,我想将几个不同表单字段上的“必需”属性更改为“假”,这样我就可以有效地保存。我已经使用了一些不同的打印语句来确定“必需”实际上在满足条件时被更改为 false,但是,当我尝试保存时,它不会让我因为字段突出显示并说他们'仍然是必需的。
几乎就像 save_model 不关心我如何编辑表单一样,旧表单及其“必需”属性覆盖了我的更改。感谢您的帮助!
admin.py
class UserForm(forms.ModelForm):
state = forms.CharField(min_length=2, widget=forms.TextInput(attrs={'placeholder':'CA'}))
zipcode = forms.CharField(max_length=5, min_length=5,)
class Meta:
model = User
fields = '__all__'
class UserAdmin(admin.ModelAdmin):
model = Order
form = UserForm
def save_model(self, request, obj, form, change):
if obj.pickup_only == 1:
form.fields['address'].required = False
form.fields['city'].required = False
form.fields['state'].required = False
form.fields['zipcode'].required = False
return super(UserAdmin, self).save_model(request, obj, form, change)
修改后的用户窗体代码:
def clean(self):
cleaned_data = super(UserForm, self).clean()
address = cleaned_data.get('address')
state = cleaned_data.get('state')
city = cleaned_data.get('city')
zipcode = cleaned_data.get('zipcode')
pickup_only = cleaned_data.get('pickup_only')
if pickup_only == True:
# I STUCK IN ADDRESS TO EMPHASIZE THE ERROR IN SCREENSHOT
self.fields_required(['first_name', 'last_name', 'dob', 'phone', 'email', 'address'])
else:
self.cleaned_data['address', 'city', 'state', 'zip code'] = ''
return self.cleaned_data
def fields_required(self, fields):
for field in fields:
print(field)
# RETURNS: first_name, last_name, dob, phone, email, address
if not self.cleaned_data.get(field, ''):
msg = forms.ValidationError("This field is required. Custom.")
self.add_error(field, msg)
当我保存时,我得到了这个:
【问题讨论】:
-
可以加
UserForm吗? -
是的,先生,会的..
-
除此之外,在您的
UserAdmin类中您定义了model = Order并在您的UserForm中定义了model = User。这会是个问题吗? -
我的 UserAdmin 中有 model = order,因为它引用了用于内联显示的模型类。由于这不是在 save_model 函数中传递的参数,因此我认为它不相关。无论如何,我将其注释掉,看看是否会对代码不起作用有任何影响,但不幸的是没有。
-
我认为更好的是,将模型中的这些字段定义为
blank=True并在clean()表单方法中手动处理验证
标签: django django-models django-forms django-rest-framework django-admin