首页 > 解决方案 > Django图像未上传

问题描述

我无法将 inlineformset_factory 中的文件实际上传到数据库或静态文件夹。表单完成然后执行succeful_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

模型.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)

表格.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)

模板.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 %}

设置.py

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

网址.py

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

标签: pythondjangopostgresqldjango-forms

解决方案


问题是我没有在 inlineformeset 中调用 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

推荐阅读