[英]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
調用已將用戶添加到數據庫。 您不必生成隨機密碼 - 如果password
為None
,則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.