簡體   English   中英

Django:帶有附加字段的CreateView?

[英]Django: CreateView with additional field?

我正在嘗試編寫一個Django CreateView(CBV),它取代用戶id而不是用戶電子郵件,並根據電子郵件確定(或創建)用戶。

我的模型不包含任何特殊內容:

class Project(models.Model):
    name = models.CharField(_('Title'), max_length=100,)
    user = models.ForeignKey(User, verbose_name=_('user'),)
    ...

我的forms.py將額外的電子郵件字段添加到表單中:

class ProjectCreateForm(forms.ModelForm):
    email = forms.EmailField(required=True, )

    class Meta:
        model = Project
        fields = ('name', ...,)

在我的views.py中,我試圖確定用戶是否存在或是否應該創建。 在這兩種情況下,用戶標識都應保存為Project實例的一部分。

class ProjectCreateDetails(CreateView):
    form_class = ProjectCreateForm
    template_name = '...'
    success_url = reverse_lazy('login') 
    model = Project

    def form_valid(self, form):
        try:
            user = User.objects.get(email=form.email)
        except User.DoesNotExist:
            user = User.objects.create_user(form.email, form.email, ''.join([random.choice(string.digits + string.letters) for i in range(0, 10)]))
            user.save()
        form.instance.user = user
        return super(ProjectCreateDetails, self).form_valid(form)

但是我遇到一個錯誤,即'Solution' object has no attribute 'email'

我是否需要切換到FormView而不是CreateView?

您收到錯誤'Solution' object has no attribute 'email'因為form.email無效。 驗證數據永遠不可用作表單或模型表單的屬性。 當表單(包括模型表單)有效時,成功驗證的數據在form.cleaned_data字典中可用。

請注意,您不需要調用user.save() create_user調用已將用戶添加到數據庫。 您不必生成隨機密碼 - 如果passwordNone ,則create_user將設置不可用的密碼。

最后,確保您沒有在ProjectCreateForm包含user字段。 你可能沒有,但是你的代碼說的是fields = ('name', ...,)所以我無法確定。

把它放在一起,你會得到以下(未經測試的)代碼:

def form_valid(self, form):
    try:
        user = User.objects.get(email=form.cleaned_data['email'])
    except User.DoesNotExist:
        user = User.objects.create_user(form.cleaned_data['email'], form.cleaned_data['email']) 
    form.instance.user = user
    return super(ProjectCreateDetails, self).form_valid(form)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM