как загрузить изображение в комментарии? - PullRequest
1 голос
/ 29 марта 2020

У меня есть небольшая форма в подробном представлении моего блога, в которой есть имя, фамилия, адрес электронной почты и поле изображения. первые три работают нормально, но когда я добавляю поле изображения в форму, форма не сохраняется со страницы, но работает со страницы администратора. это моя views.py:

def campaign_detail_view(request, id):
    template_name = 'gngo/campaign-detail.html'
    campaign = get_object_or_404(Campaign, id = id)
    comments = CampaignForm.objects.filter(campaign=campaign).order_by('-id')
    form = FormCamp(request.POST)
    if request.method == 'POST':

        if form.is_valid():
            name = request.POST.get('name')
            last = request.POST.get('last')
            email = request.POST.get('email')
            comment = CampaignForm.objects.create(campaign=campaign,name=name,last=last,email=email)
            comment.save()
            return redirect('campaign-detail',id=id)
        else:
            form = FormCamp()
    context = {
        'campaign':campaign,
        'comments':comments,
        'form':form,
    }
    context["object"] = Campaign.objects.get(id = id)
    return render(request, template_name, context) 

и это моя модель комментария:

class CampaignForm(models.Model):
    campaign = models.ForeignKey(Campaign, on_delete=models.CASCADE)
    name = models.CharField(max_length=100)
    last = models.CharField(max_length=100)
    email = models.EmailField()
    image = models.ImageField(upload_to='images')

это не пользовательская форма, так что каждый может ее заполнить. Пожалуйста, помогите мне понять, как добавить возможность загружать изображение в этой форме

ой, и эта форма:

class FormCamp(forms.ModelForm):
    class Meta:
         model = CampaignForm
         fields = ('name','last','email', 'image',)

СПАСИБО ЗА ОТВЕТЫ И ПОДДЕРЖКИ

Ответы [ 2 ]

1 голос
/ 29 марта 2020

Попробуйте это:

def campaign_detail_view(request, id):
    template_name = 'gngo/campaign-detail.html'
    campaign = get_object_or_404(Campaign, id = id)
    comments = CampaignForm.objects.filter(campaign=campaign).order_by('-id')
    form = FormCamp(request.POST, request.FILES)
    if request.method == 'POST':

        if form.is_valid():
            comment = form.save(commit=False)
            comment = CampaignForm.objects.create(campaign=campaign,name=name,last=last,email=email)
            comment = request.FILES['image'] 
            comment.save()
            return redirect('campaign-detail',id=id)
    else:
            form = FormCamp()
context = {
    'campaign':campaign,
    'comments':comments,
    'form':form,
}
context["object"] = Campaign.objects.get(id = id)
return render(request, template_name, context)

class FormCamp(forms.ModelForm): to this;
class FormCamp(forms.Form):

Не забудьте добавить enctype = multipart / form-data в форму в шаблоне.

1 голос
/ 29 марта 2020

Вместо использования формы для проверки и последующего ручного извлечения полей, вы должны использовать save метод вашего ModelForm и передать request.FILES вашей форме при ее создании.

И поскольку кампания не является редактируемым полем, оно должно быть добавлено после создания объекта.

def campaign_detail_view(request, id):
    template_name = 'gngo/campaign-detail.html'
    campaign = get_object_or_404(Campaign, id = id)
    comments = CampaignForm.objects.filter(campaign=campaign).order_by('-id')

    if request.method == 'POST':
        form = FormCamp(request.POST, request.FILES)
        if form.is_valid():
            campaign_form = form.save(commit=False)
            campaign_form.campaign = campaign
            campaign_form.save()
            return redirect('campaign-detail',id=id)
    else:
        form = FormCamp()

    context = {
        'campaign':campaign,
        'comments':comments,
        'form':form,
    }
    context["object"] = Campaign.objects.get(id = id)
    return render(request, template_name, context)

https://docs.djangoproject.com/en/2.2/topics/forms/modelforms/#the -save-method https://docs.djangoproject.com/en/2.2/topics/forms/#the -view

...