Передача user.id в класс FormWizardView в инструментах формы Django

Я пытаюсь создать многоступенчатую форму в django2.2. Судя по всему, собственный FormWizard устарел в предыдущих версиях django, поэтому единственное решение, с которым я столкнулся, - это django-formtools. У меня есть две модели, которые предоставляют FormWizard обязательные поля. Мне удалось успешно создать словарь пользовательского ввода из форм. Я собираюсь сохранить эти данные в одну из моделей. Однако для модели требуется поле user.id, поскольку это внешний ключ для объекта CustomUser и поэтому не может быть нулевым. Я считаю, что есть способ добавить этот user.id в словарь данных, а затем сохранить весь dict как экземпляр в моей целевой модели. Вот где я боролся.

Я попытался вызвать 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 как экземпляр в моей базе данных. Пока что бегаю по кругу. Любая помощь будет принята с благодарностью. Кто-нибудь, пожалуйста, укажите мне хотя бы в правильном направлении

1 ответ

Я должен перестать отвечать на свои вопросы, но какого черта... Я понял, в чем проблема... когда я попытался вызвать request.user в FormWizardView, он бросал 'request' not defined ошибка, поэтому я попытался передать классу объект запроса через self нравиться, user=self.request.user. Однако это произвело только пользовательский экземпляр, принадлежащий ModelsAdForm, а не модели CustomUser, как того требовал db... Я не могу поверить, что это было так же просто, как вызов экземпляра CustomUser с тем же значением, что и ModelsAdForm пользователь... я имею в виду 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())

и бум! форма, которая берет поля из трех моделей и сохраняет входные данные в одну модель... Теперь, чтобы сделать ее более динамичной... час рефакторинга:)

Другие вопросы по тегам