Передача user.id в класс FormWizardView в инструментах форм Django - PullRequest
0 голосов
/ 21 сентября 2019

Я пытаюсь создать многошаговую форму в django2.2.По-видимому, в предыдущих версиях django собственный FormWizard устарел, поэтому единственное решение, с которым я столкнулся, это django-formtools .У меня есть две модели, которые предоставляют FormWizard обязательные поля.Я был в состоянии сделать словарь пользовательского ввода из форм успешно.Я намерен сохранить эти данные в одну из моделей.Однако для модели требуется поле user.id, поскольку оно является внешним ключом для объекта CustomUser и поэтому не может иметь значение null.Я считаю, что есть способ добавить этот 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 Ответ

0 голосов
/ 22 сентября 2019

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

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

...