在 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())

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