Передача 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())
и бум! форма, которая берет поля из трех моделей и сохраняет входные данные в одну модель... Теперь, чтобы сделать ее более динамичной... час рефакторинга:)