4

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'

CreateViewではなくFormViewに切り替える必要がありますか?

4

1 に答える 1

7

'Solution' object has no attribute 'email'が無効であるため、エラーが発生しform.emailます。検証されたデータは、フォームまたはモデルフォームの属性として使用できることはありません。フォーム(モデルフォームを含む)が有効な場合、正常に検証されたデータがform.cleaned_dataディクショナリで利用可能になります。

を呼び出す必要はないことに注意してくださいuser.save()。このcreate_user呼び出しにより、ユーザーはすでにデータベースに追加されています。ランダムなパスワードを生成する必要もありません。もしそうならpasswordNone使用create_userできないパスワードを設定します。

user最後に、フィールドをに含めないようにしてくださいProjectCreateForm。あなたはおそらくそうではありませんが、あなたのコードは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)
于 2013-01-20T00:29:30.470 に答える