Пост создать с несколькими изображениями, используя FBV - PullRequest
0 голосов
/ 25 апреля 2018

Привет всем. Я новичок в 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 сможет добиться этого, я могу добавить видео о том, как я танцую, будто выиграл в лотерею. но я не буду слишком жадным, даже решение этого может спасти некоторые волосы на моей голове Error I get on 3rd try

Ответы [ 2 ]

0 голосов
/ 28 апреля 2018

Ниже указаны правильные значения Views.py благодаря пользователю 3054319

def post_create(request):
    ImageFormSet = modelformset_factory(Images, fields=('image','image_title', 'image_description'), extra=7)
    if request.method == "POST":
        form = PostCreateForm(request.POST or None)
        formset = ImageFormSet(request.POST or None, request.FILES or None)
        if form.is_valid() and formset.is_valid():
            instance = form.save(commit=False)
            instance.author = request.user
            instance.save()
            print(formset.cleaned_data)
            for f in formset.cleaned_data:
                try:
                    photo = Images(post=instance, image=f['image'], image_title=f['image_title'], image_description=f['image_description'])
                    photo.save()
                except Exception as e:
                    break
            return redirect('posts:single', username=instance.user.username, slug=instance.slug)
    else:
        form = PostCreateForm()
        formset = ImageFormSet(queryset=Images.objects.none())
    context = {
        'form': form,
        'formset': formset,
    }
    return render(request, 'blog/post_create.html', context)
0 голосов
/ 26 апреля 2018

Я просмотрел ваш пост для создания поста и обнаружил, что вы пытаетесь получить доступ к нескольким ключам словаря одним вызовом f.cleaned_data [image ’,‘ image_title ’], который синтаксически неверен

Если вы напечатаете (f.cleaned_data), он выдаст словарь, и вы должны знать, как получить доступ к словарю.

Вы должны использовать

фотография = изображение (post = post, image = f.cleaned_data ['image'], image_title = f.cleaned_data ['image_title'])

...