cleaned_data () возвращает пустые объекты, когда я пытаюсь загрузить несколько изображений в Django - PullRequest
0 голосов
/ 04 марта 2020

models.py:

class Object(PolymorphicModel):
    author = models.ForeignKey(ProfileUser, on_delete=models.CASCADE)
    title = models.CharField(max_length=300)
    city = models.ForeignKey(City, on_delete=models.CASCADE)
    address = models.CharField(max_length=300)
    phone = models.CharField(max_length=20, default='')
    email = models.CharField(max_length=100, default='')
    site = models.CharField(max_length=100, default='')
    facebook = models.CharField(max_length=100, default='')
    instagram = models.CharField(max_length=100, default='')
    content = models.TextField()
    rating = models.DecimalField(default=10.0, max_digits=5, decimal_places=2)
    created_date = models.DateTimeField(default=timezone.now)
    approved_object = models.BooleanField(default=False)
    admin_seen = models.BooleanField(default=False)

    def __str__(self):
        return f"{self.title}"

class Restaurant(Object):
    seats = models.IntegerField()
    bulgarian_kitchen = models.BooleanField(default=False)
    italian_kitchen = models.BooleanField(default=False)
    french_kitchen = models.BooleanField(default=False)
    category_en_name = models.CharField(max_length=100, default='restaurants')
    category_bg_name = models.CharField(max_length=100, default='Ресторанти')
    bg_name = models.CharField(max_length=100, default='Ресторант')
    is_garden = models.BooleanField(default=False)
    is_playground = models.BooleanField(default=False)

class Images(models.Model):
    object = models.ForeignKey(Object, default=None, on_delete=models.CASCADE)
    image = models.ImageField(upload_to='attachments',
                              verbose_name='Image')

forms.py:

class RestaurantForm(forms.ModelForm):
    class Meta:
        model = Restaurant
        fields = [
            'title',
            'content',
            'city',
            'address',
            'phone',
            'email',
            'site',
            'facebook',
            'instagram',
            'seats',
            'bulgarian_kitchen',
            'italian_kitchen',
            'french_kitchen',
            'is_garden',
            'is_playground'
        ]

class ImageForm(forms.ModelForm):
    image = forms.ImageField(label='Снимка')
    class Meta:
        model = Images
        fields = [
            'image'
        ]

шаблон (html) :

<form method="post" id="dialog_addObject_part">
    {% csrf_token %}
    {% for hidden in postForm.hidden_fields %}
        {{ hidden }}
    {% endfor %}
    {% for field in form %}
        <div class="fieldWrapper">
            <div class="errorcode{{field.html_name}}">
                {{ field.errors }}
            </div>
            {{ field.label_tag }} {{ field }}
            {% if field.help_text %}
            <p class="help">{{ field.help_text|safe }}</p>
            {% endif %}
        </div>
    {% endfor %}
    {{ formset.management_form }}
    {% for form in formset %}
        {{ form }}
    {% endfor %}
    <div class="utf_addObject_form">
        <button type="submit" value="Изпрати">Изпрати</button>
    </div>
</form>

views.py:

def add_object(request, category):
    if not request.user.is_authenticated:
        messages.info(request, 'За да добавите нов Обект, трябва да сте регистриран потребител!')
        return redirect('account_login')

    form = RestaurantForm(request.POST or None);


    ImageFormSet = modelformset_factory(Images,
                                        form=ImageForm, extra=3)

    if request.method == 'POST':

        formset = ImageFormSet(request.POST, request.FILES)


        if form.is_valid() and formset.is_valid():
            obj = form.save(commit=False)
            obj.author = ProfileUser.objects.get(user=request.user)
            obj.save()

            print(formset.cleaned_data)

            for form in formset.cleaned_data:
                if form:
                    image = form['image']
                    photo = Images(post=form, image=image)
                    photo.save()

            messages.success(request, 'Успешно добавихте нов Обект, може да видите вашите обекти във вашия профил!')
            return redirect('home')
    else:
        formset = ImageFormSet(queryset=Images.objects.none())

    context = {
        'form': form,
        'formset': formset
    }

    return render(request, "add_object.html", context)

В этой строке print(formset.cleaned_data) возвращаются пустые объекты, поэтому изображения не загружаются.

1 Ответ

3 голосов
/ 04 марта 2020

Вы пропустили enctype="multipart/form-data" в html форме.

из документов :

Обратите внимание, что request.FILES будет содержать данные, только если запрос Метод был POST, а отправивший запрос имеет атрибут enctype = "multipart / form-data". В противном случае request.FILES будет пустым.

Форма должна быть,

<form method="post" id="dialog_addObject_part" enctype="multipart/form-data">

</form>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...