Django Изображение не загружается - PullRequest
0 голосов
/ 12 марта 2020

Я не могу загрузить файл из inlineformset_factory в БД или в папку c. Форма завершается, затем выполняется successful_url. Я просто не понимаю, почему это не загружать файлы после отправки. Любая помощь очень ценится.

Редактировать : Я не получаю никаких ошибок вообще.

[12/Mar/2020 15:04:02] "POST /agent/listings/new/ HTTP/1.1" 302 0
[12/Mar/2020 15:04:02] "GET /agent/dashboard/ HTTP/1.1" 200 6915

Model.py

class Listing(models.Model):
    id                  = models.UUIDField(primary_key=True, default=uuid.uuid4,editable=False)
    agent               = models.ForeignKey(CustomUser, on_delete=models.DO_NOTHING)

class Images(models.Model):
    id                  = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    image               = models.ImageField(upload_to="listing/images/")
    listing_id          = models.ForeignKey(Listing, on_delete=models.DO_NOTHING)

Forms.py

class ListingImage(forms.ModelForm):
    class Meta:
        model = Images
        exclude = ()

ListingImageFormSet = inlineformset_factory(Listing, Images, fields=['image'], form=ListingImage, extra=2)

Просмотры. py

class AgentNewListing(CreateView):
    model = Listing
    fields = ['agent'] 
    template_name = 'agent/new_listing.html'
    success_url   = '/agent/dashboard/'

    def get_context_data(self, **kwargs):
        data = super(AgentNewListing, self).get_context_data(**kwargs)
        if self.request.POST:
            data['listing_form'] = ListingImageFormSet(self.request.POST)
        else:
            data['listing_form'] = ListingImageFormSet()
        return data

    def form_valid(self, form):
        context = self.get_context_data()
        listingform = context['listing_form']
        with transaction.atomic():
            form.instance.agent = self.request.user
            self.object = form.save(commit=False)

            if listingform.is_valid():
                listingform.instance = self.object
                listingform.save()
        return super(AgentNewListing, self).form_valid(form)

    def dispatch(self, request, *args, **kwargs):
        if not is_valid_agent(self.request.user):
            return redirect('/agent/signin/')

        return super(AgentNewListing, self).dispatch(request, *args, **kwargs)

Template.htlm

{% extends 'agent/agent_base.html' %}

{% block agent_body %}
{% load crispy_forms_tags %}

<!-- Page Heading -->
<div class="d-sm-flex align-items-center justify-content-between mb-4">
    <h1 class="h3 mb-0 text-gray-800">New Listing</h1>
</div>

<div class="col-sm-6 col-lg-6 ml-2">
  <form action="" method="post" enctype="multipart/form-data">{% csrf_token %}
        {{ form|crispy }}

        <table class="table">
            {{ listing_form.management_form|crispy }}

            {% for form in listing_form.forms %}
                {% if forloop.first %}
                    <thead>
                    <tr>
                        {% for field in form.visible_fields %}
                            <th>{{ field.label|capfirst }}</th>
                        {% endfor %}
                    </tr>
                    </thead>
                {% endif %}
                <tr class="">
                    {% for field in form.visible_fields %}
                        <td>
                            {# Include the hidden fields in the form #}
                            {% if forloop.first %}
                                {% for hidden in form.hidden_fields %}
                                    {{ hidden }}
                                {% endfor %}
                            {% endif %}
                            {{ field.errors.as_ul }}
                            {{ field }}
                        </td>
                    {% endfor %}
                </tr>
            {% endfor %}
        </table>
        <input class="btn btn-primary" type="submit" value="Submit"/> <a href="">back to the list</a>
    </form>
</div>
<script src="//ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery.formset/1.2.2/jquery.formset.js"></script>
<script type="text/javascript">
    $('.formset_row').formset({
        addText: 'add family member',
        deleteText: 'remove',
        prefix: 'familymember_set'
    });
</script>

{% endblock %}

Settings.py

MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')

Urls.py

if settings.DEBUG:
    urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

1 Ответ

0 голосов
/ 13 марта 2020

Проблема была в том, что я не вызывал self.request.FILES во встроенном наборе. Решение находится в представлении и выглядит следующим образом.

    def get_context_data(self, **kwargs):
        data = super(AgentNewListing, self).get_context_data(**kwargs)
        if self.request.POST:
            data['listing_form'] = ListingImageFormSet(self.request.POST, self.request.FILES)
        else:
            data['listing_form'] = ListingImageFormSet()
        return data
...