如何使用CreateView在Django中进行多个文件的上传?

2024-09-21 01:00:37 发布

您现在位置:Python中文网/ 问答频道 /正文

请帮帮我。我是Django新手,不能理解以下事情-我有CreateView的子类来创建评论。我想创建一个项目,人们可以留下他们的评论和附加文件(图像)到这个评论。一个应该有可能附加尽可能多的图像,他想一个形式与文字评论。我在网上发现了一个决定,我需要使用2个模型-1个用于文本注释的模型+1个用于图像的单独模型。是这样吗?在

在我的视图.py通过CreateView的子类。如何将新的独立图像模型与我的CreateView连接起来?在

models.py

class Descriptions(models.Model):
…
city = models.ForeignKey(Cities, on_delete=models.CASCADE)
description = models.TextField()
date_added = models.DateTimeField(auto_now_add=True)
owner = models.ForeignKey(User, on_delete=models.DO_NOTHING)
…
class Description_Photos(models.Model):
    image = models.ImageField(upload_to='images/', blank=True)
    description = models.ForeignKey(Descriptions, on_delete=models.CASCADE, related_name='photos')

forms.py

class DescriptionsForm(forms.ModelForm):
    class Meta:
        model = Descriptions
        exclude = []
        widgets = {'description': forms.Textarea(attrs={'cols':90})}

class Photos_form(forms.Form):
    photos = forms.FileField(widget=forms.FileInput(attrs={'multiple': True}))

views.py

class DescriptionCreate(CreateView):
    model = Descriptions
    form_class = DescriptionsForm
    template_name = 'countries/new_description.html'

    def get_success_url(self):
        return reverse('countries:descr', args=[self.kwargs['country_id'], self.kwargs['city_id']])

    def get_context_data(self, **kwargs):
        self.city = get_object_or_404(Cities, id=self.kwargs['city_id'])
        kwargs['city'] = self.city
        return super().get_context_data(**kwargs)

    def form_valid(self, form):
        form.instance.city = get_object_or_404(Cities, id=self.kwargs['city_id'])
        form.instance.owner = self.request.user
        messages.success(self.request, 'Your post has been added, thank you')
        return super().form_valid(form)

所以我的问题是我应该写什么视图.py对于class Photos_form(forms.Form):?如何连接这个类和我的class DescriptionCreate(CreateView)?在


Tags: py模型图像selfformidcityget
1条回答
网友
1楼 · 发布于 2024-09-21 01:00:37

我在相同的情况下使用表单集https://docs.djangoproject.com/en/2.0/topics/forms/formsets/

为图像模型声明窗体集

…

# forms.py

class DescriptionsForm(forms.ModelForm):
    class Meta:
        model = Descriptions
        exclude = []
        widgets = {'description': forms.Textarea(attrs={'cols':90})}

class Photos_form(forms.Form):
    photos = forms.FileField(widget=forms.FileInput(attrs={'multiple': True}))


##### Declare FORMSET !!! ###
class BasePhotosFormSet(BaseModelFormSet):

    """By default, when you create a formset from a model, the formset
    will use a queryset that includes all objects in the model"""

    def __init__(self, *args, **kwargs):
        if 'city' in kwargs.keys():
            city = kwargs.pop('city')
        else:
            city = None
        super().__init__(*args, **kwargs)
        if city and isinstance(instance, Cities):
            self.queryset = Description_Photos.objects.filter(city=city)
        else:
            self.queryset = Description_Photos.objects.none()

# I usually declare formset for create operations and formset for update operations separately          
PhotosCreateFormSet = forms.modelformset_factory(Description_Photos, Photos_form,
                                                    fields=Photos_form.Meta.fields, extra=0,
                                                    formset=BasePhotosFormSet)


PhotosUpdateFormSet = forms.modelformset_factory(Description_Photos, Photos_form, can_delete=True,
                                              fields=PropertyImageForm.Meta.fields, extra=0,
                                              formset=BasePhotosFormSet)


#############

# views.py

class DescriptionCreate(CreateView):

    def __init__(self, **kwargs):
        self.object = None
        super().__init__(**kwargs)

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        if self.request.POST:
            images_formset = PhotosCreateFormSet(self.request.POST, self.request.FILES, city=self.object)
        else:
            images_formset = PhotosCreateFormSet(instance=self.object)
        context['formset'] = images_formset
        context['city'] = self.object
        return context

模板

^{pr2}$

我试着把我的自定义代码改写成你的变体。 我想在您的示例中将self.city声明为创建模型实例是个坏主意:Django自动创建self.object

相关问题 更多 >

    热门问题