【问题标题】:Passing user.id to class FormWizardView in Django form-tools将 user.id 传递给 Django 表单工具中的 FormWizardView 类
【发布时间】:2020-01-22 09:33:51
【问题描述】:

我正在尝试在 django2.2 中创建一个多步骤表单。显然,原生 FormWizard 在以前的 django 版本中已被弃用,所以我遇到的唯一解决方案是django-formtools。我有两个模型为 FormWizard 提供必填字段。我已经能够成功地从表单中制作用户输入字典。我打算将此数据保存到其中一个模型中。但是,该模型需要一个 user.id 字段,因为它是 CustomUser 对象的外键,因此不能为空。我相信有一种方法可以将此 user.id 添加到数据字典中,然后将整个字典保存为我的目标模型中的实例。这就是我一直在苦苦挣扎的地方。

我尝试调用 user=request.user,但出现错误提示“未定义请求”,因为这是基于类的视图(我猜这就是原因)。

我的模型

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 以便我可以成功地将 dict 作为实例保存在我的数据库中。到目前为止,我在兜圈子。任何帮助将不胜感激。有人请至少指出我正确的方向

【问题讨论】:

    标签: django python-3.x django-forms django-formwizard django-formtools


    【解决方案1】:

    我不得不停止回答我自己的问题,但到底是怎么回事.. 我发现问题出在哪里了...当我尝试在 FormWizardView 中调用 request.user 时,它抛出了 'request' not defined 错误,所以我试图通过 selfuser=self.request.user 给类一个请求对象。但是,这仅产生了一个属于 ModelsAdForm 而不是 CustomUser 模型的用户实例,正如 db 所要求的那样......我不敢相信它像调用与 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())
    

    然后轰隆隆!一个表单,它从三个模型中获取字段并将输入数据保存到一个模型中......现在让它更加动态......重构小时:)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-31
      • 2020-05-08
      • 2020-03-26
      • 1970-01-01
      • 2020-04-13
      • 2016-08-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多