为什么不将图像保存在我的Django上传表单中?

问题描述 投票:0回答:1

我无法使用Django正确上传图片字段。我使用的是松脆的表单,并且表单和页面上的所有其他元素都可以正常工作。

图像字段不会产生任何错误或保存错误。我可以通过admin很好地添加图像,但仅在我松脆的表单上才失败。

views.py

class CarCreate(generic.CreateView):

    model = Car

    slug_field = 'id'
    slug_url_kwarg = 'car_create'

    template_name = 'showroom/car_create.html'
    form_class = CreateCarForm
    success_url = None

    def get_context_data(self, **kwargs):
        data = super(CarCreate, self).get_context_data(**kwargs)
        if self.request.POST:
            data['images'] = CarImageFormSet(self.request.POST)
        else:
            data['images'] = CarImageFormSet()
        return data

    def form_valid(self, form):
        context = self.get_context_data()
        images = context['images']
        with transaction.atomic():
            form.instance.created_by = self.request.user
            self.object = form.save()
            if images.is_valid():
                images.instance = self.object
                images.create()
        return super(CarCreate, self).form_valid(form)

    def get_success_url(self):
        # return reverse_lazy('showroom:cars', kwargs={'slug': self.object.id}) # Throws an error
        return reverse_lazy('showroom:cars')

forms.py

class CreateCarForm(ModelForm):

    class Meta:
        model = Car
        exclude = ['seller', 'id']

    def __init__(self, *args, **kwargs):
        super(CreateCarForm, self).__init__(*args, **kwargs)
        self.helper = FormHelper()
        self.helper.form_tag = True
        self.helper.form_class = 'form-horizontal'
        self.helper.form_enctype = 'multipart/'
        self.helper.label_class = 'col-md-3 create-label'
        self.helper.field_class = 'col-md-9'
        self.helper.layout = Layout(
            Div(
                Field('manufacturer'),
                Field('car_model'),
                Field('model_year'),
                Field('transmission'),
                Field('mileage'),
                Field('description'),
                Field('price'),
                Field('drivetrain'),
                Field('engine_displacement'),
                Field('forced_induction'),
                Fieldset('Add Images',
                    Formset('images')),
                HTML("<br>"),
                ButtonHolder(Submit('submit', 'Save')),    
            )
        )

formset.html

{% load crispy_forms_tags %}

<table>
{{ formset.management_form|crispy }}

    {% for form in formset.forms %}
            <tr class="{% cycle 'row1' 'row2' %} formset_row-{{ formset.prefix }}">
                {% 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>
</br>

{% block scripts %}
{% load static %}
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>    
    <script src="{% static 'js/django-dynamic-formset/jquery.formset.js' %}"></script>
    <script type="text/javascript">
        $('.formset_row-{{ formset.prefix }}').formset({
            addText: 'add another',
            deleteText: 'remove',
            prefix: '{{ formset.prefix }}',
        });
    </script>


{% endblock %}

car_create.html

{% extends "base.html" %}
{% load crispy_forms_tags %}
{% block content %}
<div class="container">
    <div class="card">
        <div class="card-header">
            <h2>Submit a car</h2>
        </div>
        <form method="POST" enctype="multipart/form-data">
            {% csrf_token %}
            <div class="card-body">
                {% crispy form %}
            </div>
        </form>
    </div>
</div>
{% endblock content %}

我无法使用Django正确上传图片字段。我使用的是松脆的表单,并且表单和页面上的所有其他元素都可以正常工作。图片字段不会产生任何错误...

python django django-forms django-crispy-forms
1个回答
0
投票

因为它是图像/文件字段,所以还需要像这样执行request.FILES

© www.soinside.com 2019 - 2024. All rights reserved.