Автоматическое заполнение поля формы - django
Я пытаюсь автоматически заполнить поле в форме, чтобы пользователь не вводил данные.
В данном случае пользователь начнет со страницы show_venue
, на которой будет отображен ряд товаров.
Нажав на один из этих продуктов, пользователь перенаправляется на страницу продукта, где в форме можно оставить отзыв.
Форма требует от пользователя выбрать место, где проводился обзор.
Я хочу упростить это.
Поскольку пользователь уже пришел со страницы venue_id
, я хотел бы автоматически заполнить это поле.
Я пробовал разные вещи, найденные на этом форуме, и оставил последнюю попытку, которая в настоящее время выдает следующее сообщение об ошибке: cannot unpack non-iterable NoneType object
.
Небольшая причуда - вы заметите, что форма на самом деле сохраняется в функции show_venue
, а не в функции show_product_from_venue
(страница продукта). Это связано с процессом перенаправления, который я должен был реализовать: пользователь перенаправляется на предыдущую страницу venue_ID после отправки формы: сделал это с помощью javascript в шаблоне. Я не добавляю страницу шаблона, чтобы сохранить краткость вопроса, и не думаю, что это будет важно для моего вопроса.
просмотров
def show_venue(request, venue_id):
if request.method == "POST" and 'btnreview_form' in request.POST:
form = CatalogueReviewForm(request.POST)
data = form.save(commit=False)
data.product_id = venue_id
data.catalogue_id = venue_id
data.venue_id = CatalogueReviewRating.objects.get(form.cleaned_data['venue']) #<-- this is where I am struggling
data.user_id = request.user.id
data.save()
ven_id = request.POST.get('venue_id')
if form.is_valid():
print(data)
form.save()
return HttpResponseRedirect(ven_id)
else:
venue = Venue.objects.get(pk=venue_id)
menu = Catalogue.objects.filter(venue=venue_id)
categories = Catalogue.objects.filter(venue=venue_id).order_by('category_order')
return render(request, 'main/show_venue.html',{'venue':venue, 'menu':menu, 'categories':categories,'product':product,'venue_id':venue_id,'object':object})
def show_product_from_venue(request, catalogue_id):
url = request.META.get('HTTP_REFERER')
product = Catalogue.objects.get(pk=catalogue_id)
form = CatalogueReviewForm()
venue_form = VenueForm()
submitted = False
data = Catalogue.objects.filter(pk=catalogue_id).annotate(
avg_rating =Avg('catalogue_comments__rating'),)
if request.method == "POST" and 'btnvenue_form' in request.POST:
venue_form = VenueForm(request.POST)
if venue_form.is_valid():
venue_form.save()
return HttpResponseRedirect(url)
else:
venue_form = VenueForm
if 'submitted' in request.GET:
submitted = True
return render(request,"main/show_product_from_venue.html", {'form':form, 'submitted':submitted, 'product':product, 'venue_form':venue_form, 'data':data})
form
class CatalogueReviewForm(forms.ModelForm):
venue = forms.ModelChoiceField(queryset = Venue.objects.all(),required=False)
class Meta:
model = CatalogueReviewRating
fields = ['review', 'rating']
модель
class CatalogueReviewRating(models.Model):
user = models.ForeignKey(User,blank=True, on_delete=models.SET_NULL, null=True,related_name="catalogueusercomments")
product=models.ForeignKey(Catalogue, related_name="catalogue_comments", on_delete=models.SET_NULL, null=True)
venue = models.ForeignKey(Venue, blank=True, null=True, related_name="catalogue_venues", on_delete=models.SET_NULL)
url
path('show_venue/<venue_id>', views.show_venue,name="show-venue"),
path('show_product_from_venue/<catalogue_id>', views.show_product_from_venue,name="show-product-from-venue"),