Django ModelForm中缺少id字段
我正在使用Django ModelForm中缺少id字段,django,django-forms,django-crispy-forms,Django,Django Forms,Django Crispy Forms,我正在使用DjangoCrispyForms,我已经为我的用户模型创建了一个ModelForm。 在Meta类中,我已注册了我希望在表单中包含的字段,其中一个字段是用户的id。 问题是这个id字段没有出现在表单中,我必须手动将这样一个字段添加到我的表单类中。当我想将更改保存到DB,并且需要从清理的\u数据中提取id时,它会变得更加复杂 class EditUserForm(forms.ModelForm): id = forms.IntegerField() # needed to ad
DjangoCrispyForms
,我已经为我的用户
模型创建了一个ModelForm
。在
Meta
类中,我已注册了我希望在表单中包含的字段,其中一个字段是用户的id
。问题是这个
id
字段没有出现在表单中,我必须手动将这样一个字段添加到我的表单类中。当我想将更改保存到DB,并且需要从清理的\u数据中提取id
时,它会变得更加复杂
class EditUserForm(forms.ModelForm):
id = forms.IntegerField() # needed to add this
def __init__(self, *args, **kwargs):
super(EditUserForm, self).__init__(*args, **kwargs)
self.helper = FormHelper(self)
self.fields['id'].widget = HiddenInput()
self.helper.layout = Layout(
Fieldset(
'Edit user',
'username',
'first_name',
'last_name',
'email',
'is_superuser',
'id'
),
ButtonHolder(
Submit('submit', 'Save')
))
def clean(self):
username = self.cleaned_data.get('username')
email = self.cleaned_data.get('email')
if len(User.objects.filter(username=username)) > 1:
self.add_error('username', 'Username is taken.')
if len(User.objects.filter(email=email)) > 1:
self.add_error('email', 'Account with this email exists')
return self.cleaned_data
def save(self, commit=True):
instance = super(EditUserForm, self).save(commit=False)
data_id = self.cleaned_data.get('id') # need to get this from data
instance.id = data_id # and set id for instance
if commit:
instance.save()
return instance
class Meta:
model = User
fields = ['id', 'username', 'first_name', 'last_name', 'email', 'is_superuser'] # here we can see that id is actually present in fields
我是遗漏了什么还是应该遗漏什么?通常id
不在表单中。URL用于指定id,通常不可编辑。那么我的方法好吗?或者我应该从视图中调用.save(commit=False)
,然后将id添加到实例,然后保存实例?视图位于哪里?通常的想法是表单用于创建和编辑对象。但是,视图有点不同,因为对于编辑,URL决定id
,相应的对象被传递到表单。通常,表单不用于编辑/显示id,因为这对用户来说通常并不重要。例如,用户希望下订单,即数据库中的第4105行,这一事实并不真正相关。请参阅此处的示例:这是事实,这与用户无关,但对我来说,需要知道需要编辑哪个id。虽然我知道我可以从视图中的url获取id。但什么方法更好呢?另外,我不想在编辑表单中更改密码,这就是为什么我有两个单独的表单用于创建和编辑。