【问题标题】:Django: CreateView with additional field?Django:带有附加字段的 CreateView?
【发布时间】:2013-01-20 00:06:25
【问题描述】:

我正在尝试编写一个 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 中,我试图确定用户是否存在或应该被创建。在这两种情况下,用户 ID 都应保存为 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?

【问题讨论】:

    标签: python django forms django-class-based-views


    【解决方案1】:

    您收到错误'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)
    

    【讨论】:

    • 写这篇评论是为了指出你可以使用get_or_create方法
    • @AymaneShuichi 不,我们不能在这里使用get_or_create - 我们正在使用create_user 方法,以便正确处理密码。
    猜你喜欢
    • 2020-02-18
    • 2019-10-12
    • 1970-01-01
    • 2018-07-23
    • 2017-03-21
    • 2017-08-16
    • 2020-07-08
    • 1970-01-01
    • 2015-05-15
    相关资源
    最近更新 更多