Привет всем. Я новичок в Django, и я иду лысым, дергая себя за волосы Может ли кто-нибудь помочь мне с этим.
Я пытаюсь добавить несколько изображений в свой пост, и у меня возникают проблемы. У меня есть 2 модели. Одна модель поста и одна модель изображения. Моя модель уже имеет 1 поле изображения. Затем у меня есть другая связанная модель, которая позволяет несколько изображений. Вот как выглядят мои модели
class Post(models.Model):
user = models.ForeignKey(User, related_name='posts')
title = models.CharField(max_length=250, unique=True)
slug = models.SlugField(allow_unicode=True, unique=True)
message = models.TextField()
post_image = models.ImageField()
class Image (models.Model): #(Images)
post = models.ForeignKey(Post, on_delete=models.CASCADE)
image = models.ImageField(upload_to='images/', blank=True, null=True)
image_title = models.CharField(max_length=100)
image_description = models.CharField(max_length=250)
def __str__(self):
return self.post.title + " Image"
Ниже показано, как выглядят мои взгляды. Когда форма загружается. Он имеет несколько полей изображения. Это просто не сохраняет эти изображения, когда мой пост создается. Я получаю сообщение, которое полностью игнорирует наборы форм и несколько изображений. Он показывает только аспекты модели Post и 1 изображение модели Post. Даже в Админе нет нескольких изображений.
Может кто-нибудь указать мне, в чем заключается ошибка в моем коде?
VIEWS.py 1-я попытка
@login_required
def post_create(request):
ImageFormset = modelformset_factory(Image, fields=('image', 'image_title', 'image_description'), extra=7)
if request.method == 'POST':
form = PostForm(request.POST, request.FILES)
formset = ImageFormset(request.POST or None, request.FILES or None)
if form.is_valid() and formset.is_valid():
post = form.save(commit=False)
post.user = request.user
post.save() ## It seems as if my code just plays till here and then disconnects
for f in formset:
try:
photo = Image(post=post, image=f.cleaned_data['image', 'image_title', 'image_description'])
photo.save()
return redirect('posts:single', username=request.user.username, slug=post.slug)
except Exception as e:
break
else: ## This part works too as it shows the correct empty form
form = PostForm()
formset = ImageFormset(queryset=Image.objects.none())
context = {'form': form, 'formset': formset}
return render(request, 'posts/post_form.html', context)
ниже - мои forms.py
class PostForm(forms.ModelForm):
class Meta:
model = Post
fields = ('title', 'message', 'post_image' )
Изменены представления, предложенные пользователем 3054319, см. Ниже. Он работает нормально, но сохраняет только 1 изображение в папке изображений. Все правильно, мои отступы
VIEWS.py 2-я попытка
@login_required
def post_create(request):
ImageFormset = modelformset_factory(Prep, fields=('image', 'image_title', 'image_description'), extra=7)
if request.method == 'POST':
form = PostForm(request.POST, request.FILES)
formset = ImageFormset(request.POST or None, request.FILES or None)
if form.is_valid() and formset.is_valid():
post = form.save(commit=False)
post.user = request.user
post.save()
for f in formset:
try:
photo = Prep(post=post, image=f.cleaned_data['image'], image_title=f.cleaned_data['image_title'],
image_description=f.cleaned_data'image_description'])
photo.save()
return redirect('posts:single', username=request.user.username, slug=post.slug)
except Exception as e:
break
Затем я попытался удалить оператор try and кроме и получить перенаправление вне цикла Сохраняет все 7 изображений , но в конце выдает ошибку (см. Прикрепленное изображение ошибки ниже)
VIEWS.py 3-я попытка
@login_required
def post_create(request):
ImageFormset = modelformset_factory(Prep, fields=('image', 'image_title', 'image_description'), extra=7)
if request.method == 'POST':
form = PostForm(request.POST, request.FILES)
formset = ImageFormset(request.POST or None, request.FILES or None)
if form.is_valid() and formset.is_valid():
post = form.save(commit=False)
post.user = request.user
post.save()
for f in formset:
photo = Prep(post=post, image=f.cleaned_data['image'], image_title=f.cleaned_data['image_title'], image_description=f.cleaned_data['image_description'])
photo.save()
return redirect('posts:single', username=request.user.username, slug=post.slug)
ошибка изображения ниже
Если CBV сможет добиться этого, я могу добавить видео о том, как я танцую, будто выиграл в лотерею. но я не буду слишком жадным, даже решение этого может спасти некоторые волосы на моей голове