在 Django 表单工具中将 user.id 传递给 class FormWizardView
Passing user.id to class FormWizardView in Django form-tools
我正在尝试在 django2.2 中创建一个多步骤表单。显然,本机 FormWizard 在以前的 django 版本中已被弃用,所以我 运行 唯一的解决方案是 django-formtools。我有两个模型为 FormWizard 提供必填字段。我已经能够成功地从表单中制作用户输入的字典。我打算将这些数据保存到其中一个模型中。但是,该模型需要一个 user.id 字段,因为它是 CustomUser 对象的外键,因此不能为空。我相信有一种方法可以将这个 user.id 添加到数据字典中,然后将整个字典保存为我的目标模型中的一个实例。这是我一直在努力的地方。
我试过调用 user=request.user 但出现错误提示 'request is not defined' 因为这是一个基于 class 的视图(我想这就是原因)。
我的模型
class Category(models.Model):
name= models.CharField(blank = True, max_length=500)
def __str__(self):
return self.name
class ModelsAd(models.Model):
title = models.CharField(max_length=500)
category = models.ForeignKey(Category,default=1, on_delete=models.CASCADE)
location = models.ForeignKey(Location,default=1, blank=True, on_delete=models.CASCADE)
description = models.CharField(max_length=1000)
price = models.PositiveIntegerField(default=1000)
user = models.ForeignKey(CustomUser, on_delete=models.CASCADE)
created_at = models.DateTimeField(default=timezone.now)
def __str__(self):
return self.title
我的表格
all_categories = Category.objects.all()
class CategoryChoiceForm(forms.Form):
category = forms.ModelChoiceField(queryset = all_categories, to_field_name = "name", empty_label=None)
class ModelsAdForm(ModelForm):
class Meta:
model = ModelsAd
fields = ('title','location', 'description', 'price')
我的观点
from formtools.wizard.views import SessionWizardView
class FormWizardView(SessionWizardView):
template_name = "post_ad.html"
form_list = [CategoryChoiceForm, ModelsAdForm]
def done(self, form_list, **kwargs):
form_data = [form.cleaned_data for form in form_list]
data_dict={}
for item in form_data:
data_dict.update(item)
add_data=ModelsAd(**data_dict)
# add_data.save()
test=ModelsAd.objects.all()
print(test)
return render(self.request, 'index.html',locals())
我需要将 user.id 传递给 FormWizardView,以便我可以将其附加到 data_dict,这样我就可以成功地将字典作为实例保存在我的数据库中。到目前为止,我在 运行 圈子里。任何帮助将不胜感激。有人请至少给我指出正确的方向
我不得不停止回答我自己的问题,但到底是什么......我想出了问题是什么......当我尝试在 FormWizardView
中调用 request.user
时,它抛出一个'request' not defined
错误,所以我试图通过 self
给 class 一个请求对象,比如 user=self.request.user
。然而,这只产生了一个属于 ModelsAdForm 而不是 CustomUser 模型的用户实例,正如数据库所要求的那样......我不敢相信它就像调用与 ModelsAdForm 具有相同值的 CustomUser 实例一样简单用户...我的意思是 user=CustomUser.objects.get(email=self.request.user)
因此我将 FormWizardView 修改为如下所示:
class FormWizardView(SessionWizardView):
template_name = "post_ad.html"
form_list = [CategoryChoiceForm, ModelsAdForm]
def done(self, form_list, **kwargs):
form_data = [form.cleaned_data for form in form_list]
data_dict={}
for item in form_data:
data_dict.update(item)
data_dict.update({'user':CustomUser.objects.get(email=self.request.user)})
add_data=ModelsAd(**data_dict)
add_data.save()
return render(self.request, 'index.html',locals())
繁荣!一种从三个模型中获取字段并将输入数据保存到一个模型的表单......现在让它更加动态......重构小时:)
我正在尝试在 django2.2 中创建一个多步骤表单。显然,本机 FormWizard 在以前的 django 版本中已被弃用,所以我 运行 唯一的解决方案是 django-formtools。我有两个模型为 FormWizard 提供必填字段。我已经能够成功地从表单中制作用户输入的字典。我打算将这些数据保存到其中一个模型中。但是,该模型需要一个 user.id 字段,因为它是 CustomUser 对象的外键,因此不能为空。我相信有一种方法可以将这个 user.id 添加到数据字典中,然后将整个字典保存为我的目标模型中的一个实例。这是我一直在努力的地方。
我试过调用 user=request.user 但出现错误提示 'request is not defined' 因为这是一个基于 class 的视图(我想这就是原因)。
我的模型
class Category(models.Model):
name= models.CharField(blank = True, max_length=500)
def __str__(self):
return self.name
class ModelsAd(models.Model):
title = models.CharField(max_length=500)
category = models.ForeignKey(Category,default=1, on_delete=models.CASCADE)
location = models.ForeignKey(Location,default=1, blank=True, on_delete=models.CASCADE)
description = models.CharField(max_length=1000)
price = models.PositiveIntegerField(default=1000)
user = models.ForeignKey(CustomUser, on_delete=models.CASCADE)
created_at = models.DateTimeField(default=timezone.now)
def __str__(self):
return self.title
我的表格
all_categories = Category.objects.all()
class CategoryChoiceForm(forms.Form):
category = forms.ModelChoiceField(queryset = all_categories, to_field_name = "name", empty_label=None)
class ModelsAdForm(ModelForm):
class Meta:
model = ModelsAd
fields = ('title','location', 'description', 'price')
我的观点
from formtools.wizard.views import SessionWizardView
class FormWizardView(SessionWizardView):
template_name = "post_ad.html"
form_list = [CategoryChoiceForm, ModelsAdForm]
def done(self, form_list, **kwargs):
form_data = [form.cleaned_data for form in form_list]
data_dict={}
for item in form_data:
data_dict.update(item)
add_data=ModelsAd(**data_dict)
# add_data.save()
test=ModelsAd.objects.all()
print(test)
return render(self.request, 'index.html',locals())
我需要将 user.id 传递给 FormWizardView,以便我可以将其附加到 data_dict,这样我就可以成功地将字典作为实例保存在我的数据库中。到目前为止,我在 运行 圈子里。任何帮助将不胜感激。有人请至少给我指出正确的方向
我不得不停止回答我自己的问题,但到底是什么......我想出了问题是什么......当我尝试在 FormWizardView
中调用 request.user
时,它抛出一个'request' not defined
错误,所以我试图通过 self
给 class 一个请求对象,比如 user=self.request.user
。然而,这只产生了一个属于 ModelsAdForm 而不是 CustomUser 模型的用户实例,正如数据库所要求的那样......我不敢相信它就像调用与 ModelsAdForm 具有相同值的 CustomUser 实例一样简单用户...我的意思是 user=CustomUser.objects.get(email=self.request.user)
因此我将 FormWizardView 修改为如下所示:
class FormWizardView(SessionWizardView):
template_name = "post_ad.html"
form_list = [CategoryChoiceForm, ModelsAdForm]
def done(self, form_list, **kwargs):
form_data = [form.cleaned_data for form in form_list]
data_dict={}
for item in form_data:
data_dict.update(item)
data_dict.update({'user':CustomUser.objects.get(email=self.request.user)})
add_data=ModelsAd(**data_dict)
add_data.save()
return render(self.request, 'index.html',locals())
繁荣!一种从三个模型中获取字段并将输入数据保存到一个模型的表单......现在让它更加动态......重构小时:)