【问题标题】:How do I make my Django form save images?如何让我的 Django 表单保存图像?
【发布时间】:2020-02-16 15:53:15
【问题描述】:

我为用户创建了一个上传表单,允许他们创建模型对象。其他一切正常,但图像字段不存储加载的图像。我在 views.py 中使用 Crispy FormHelper,但 HTML 源代码显示元素 (enctype, layout_class, field_class etc...) 未加载。我认为这就是问题所在。

呈现的表单如下所示:

对于上下文,表单应如下所示:

<form  class="form-horizontal" method="post" >
...
</form>

我已经逐行浏览了代码and the tutorial,但我找不到问题所在。

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)
    self.request.POST:
            data['images'] = CarImageFormSet(self.request.POST, 
        self.request.FILES)
        else:
            data['images'] = CarImageFormSet()
        return data

    def form_valid(self, form):
        context = self.get_context_data()
        images = context['images']
        with transaction.atomic():
            form.instance.seller = self.request.user
            self.object = form.save()
            if images.is_valid():
                images.instance = self.object
                images.save()
        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.form_enctype = 'multipart/form-data'
        self.helper.layout = Layout(
            Div(
                ...
                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>
        {% csrf_token %}
        <div class="card-body">
            {% crispy form %}
        </div>
      </div>
</div>
{% endblock content %}

更新

我对@9​​87654335@ 进行了修改,并得到了酥脆的表格。它仍然不会呈现 FormHelper 字段,因此不会保存图像。

查看渲染的表单代码,它渲染了form-horizontal和其他布局特征,但它只忽略了enctype。 Crispy 文档根本没有提到 form_enctype。

终于找到解决方案了!

我终于找到了解决办法。它有点受陪审团操纵,但一点点胶带永远不会受伤。请参阅下面的答案。

【问题讨论】:

  • 你为什么要删除你之前提出的这个问题?错误依旧。
  • 前一个是从 jQuery 加载问题开始的,我在解决较小的问题时对其进行了编辑和重新编辑,直到我认为最好针对这个问题开始一个新的。

标签: html django post django-forms django-crispy-forms


【解决方案1】:

我知道与enctype 字段相关的问题。我已将它放在我的 FormHelper 中,但在实际的 HTML 用户会话期间它从未传递到表单中。所以我只是将它添加到封闭的car_create.html 表单文件中,如下所示:

            <form method="POST" enctype="multipart/form-data">
                {% crispy form %}
            </form>

表单现在是嵌套的,但它可以工作!我很高兴。

【讨论】:

    猜你喜欢
    • 2018-05-16
    • 2020-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-06
    • 1970-01-01
    • 2012-11-08
    • 1970-01-01
    相关资源
    最近更新 更多