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。但什么方法更好呢?另外,我不想在编辑表单中更改密码,这就是为什么我有两个单独的表单用于创建和编辑。