【发布时间】: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 %}
更新
我对@987654335@ 进行了修改,并得到了酥脆的表格。它仍然不会呈现 FormHelper 字段,因此不会保存图像。
查看渲染的表单代码,它渲染了form-horizontal和其他布局特征,但它只忽略了enctype。 Crispy 文档根本没有提到 form_enctype。
终于找到解决方案了!
我终于找到了解决办法。它有点受陪审团操纵,但一点点胶带永远不会受伤。请参阅下面的答案。
【问题讨论】:
-
你为什么要删除你之前提出的这个问题?错误依旧。
-
前一个是从 jQuery 加载问题开始的,我在解决较小的问题时对其进行了编辑和重新编辑,直到我认为最好针对这个问题开始一个新的。
标签: html django post django-forms django-crispy-forms