Создание форм редактирования modelformset_factory
Последние несколько месяцев я изучаю django и работаю над проектом электронной коммерции, чтобы продолжить свое обучение, но в последнее время меня совершенно поставила в тупик проблема, с которой я столкнулся.
Я использую ForeignKey для добавления нескольких изображений к каждому товару, и в настоящее время у меня есть форма, которая позволяет мне создать пост и добавить в него до 20 изображений. Я нашел в Интернете некоторую помощь, чтобы заставить эту форму работать, и много изучал ее, чтобы убедиться, что я понимаю ее, но когда я попытался сделать ее в форме редактирования, я полностью потерялся.
Вот мой код
models.py
from django.db import models
from django.template.defaultfilters import slugify
from users.models import User
# Create your models here.
def get_thumbnail_filename(instance, filename):
title = instance.name
slug = slugify(title)
return "post_images/%s-%s" % (slug, filename)
class Product(models.Model):
seller = models.ForeignKey(User, on_delete=models.CASCADE, null=True)
name = models.CharField(max_length=200)
description = models.TextField()
created = models.DateTimeField(auto_now_add=True)
price = models.FloatField()
thumbnail = models.ImageField(upload_to=get_thumbnail_filename, null=True)
def __str__(self):
return self.name
def get_image_filename(instance, filename):
title = instance.product.name
slug = slugify(title)
return "post_images/%s-%s" % (slug, filename)
class Images(models.Model):
product = models.ForeignKey(Product, default=None, on_delete=models.CASCADE, null=True)
img = models.ImageField(upload_to=get_image_filename,
verbose_name='Image')
class Meta:
verbose_name_plural = "Images"
views.py
@login_required
def add_product(request):
ImageFormSet = modelformset_factory(Images,
form=ImageForm, extra=20)
#'extra' means the number of photos that you can upload ^
if request.method == 'POST':
postForm = ProductForm(request.POST, request.FILES)
formset = ImageFormSet(request.POST, request.FILES,
queryset=Images.objects.none())
if postForm.is_valid() and formset.is_valid():
post_form = postForm.save(commit=False)
post_form.user = request.user
post_form.save()
for form in formset.cleaned_data:
#this helps to not crash if the user
#do not upload all the photos
if form:
image = form['img']
photo = Images(product=post_form, img=image)
photo.save()
# use django messages framework
messages.success(request,
"Yeeew, check it out on the home page!")
return HttpResponseRedirect("/")
else:
print(postForm.errors, formset.errors)
else:
postForm = ProductForm()
formset = ImageFormSet(queryset=Images.objects.none())
return render(request, 'core/product-form.html',
{'postForm': postForm, 'formset': formset})
Это та часть, где я могу получить набор запросов для заполнения формы, но когда я перехожу к сохранению, форма перезагружается пустой без изображений с сообщением о том, что поля являются обязательными
@login_required
def edit_product(request, pk):
pro_in = get_object_or_404(Product, id=pk)
ImageFormSet = modelformset_factory(Images, fields='__all__', extra=20, max_num=20)
#'extra' means the number of photos that you can upload ^
if request.method == 'GET':
context = {'postForm': ProductForm(instance=pro_in), 'formset':ImageFormSet(queryset=Images.objects.filter(product_id=pk))}
return render(request, 'core/product-form.html', context)
if request.method == 'POST':
postForm = ProductForm(request.POST, request.FILES, instance=pro_in)
formset = ImageFormSet(request.POST, request.FILES, queryset=Images.objects.filter(product_id=pk))
if postForm.is_valid() and formset.is_valid():
post_form.save()
fromset.save()
# use django messages framework
messages.success(request,
"Yeeew, check it out on the home page!")
return HttpResponseRedirect("/")
else:
print(postForm.errors, formset.errors)
else:
postForm = ProductForm()
formset = ImageFormSet(queryset=Images.objects.none())
return render(request, 'core/product-form.html',
{'postForm': postForm, 'formset': formset})
Если вам нужно посмотреть мои forms.py, или urls.py, просто спросите.
Любая помощь будет высоко оценена!