首页 > 解决方案 > 为什么我的动态表单集不显示任何字段

问题描述

我的目标是为汽车定义一个上传表单,供用户上传包含所有相关详细信息的汽车,并从同一页面添加图像。

Admin 表单完美运行,我只想在自定义页面中模拟它——这是一项非常困难的任务!我正在使用本教程,更改了字段以匹配我的项目。

我还使用 django-dynamic-formset jQuery 插件来提供用户需要的附加图像字段。

我已经坚持了一周,我不确定问题出在哪里,所以我将分享很多代码。

class ImagesInline(admin.TabularInline):
    model = Image

@admin.register(Car)
class CarAdmin(admin.ModelAdmin):
    list_display = ('manufacturer', 'car_model', 'model_year', 'mileage', 'status', 'date_added', 'price', 'seller')
    list_filter = ('manufacturer', 'status', 'transmission')
    fieldsets = (
        ('General information', {
            'fields': ('manufacturer', 'car_model',
            'model_year', 'price', 'vin', 'mileage', 'transmission', 'engine_displacement', 
            'forced_induction', 'drivetrain', 'description',)
        }),
       ('Availability', {
            'fields': ('status', 'seller')
        }),
    )
    inlines = [ImagesInline]

这是 CarCreate 视图

class CarCreate(generic.CreateView):

    model = Car
    # fields = '__all__'
    success_url = reverse_lazy('car-detail.html')

    slug_field = 'id'
    slug_url_kwarg = 'car_create'

    template_name = 'showroom/car_create.html'
    form_class = CarImageForm
    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():
                titles.instance = self.object
                titles.save()
        return super(CarCreate, self).form_valid(form)

    def get_success_url(self):
        return reverse_lazy('showroom:car_detail', kwargs={'id': self.object.id})

模板 car_create.html

{% extends "base.html" %}

{% load crispy_forms_tags %}
{% block content %}
<div class="container">
    <div class="card">
        <div class="card-header"></div>
            <h2>Upload a car</h2>
        </div>
    <div class="card-body">
        {% crispy form %}
    </div>
</div>
{% endblock content %}

custom_layout_object.py

from crispy_forms.layout import LayoutObject, TEMPLATE_PACK
from django.shortcuts import render
from django.template.loader import render_to_string 

class Formset(LayoutObject):
    template = "showroom/formset.html"

    def __init__(self, formset_name_in_context, template=None):
        self.formset_name_in_context = formset_name_in_context
        self.fields = []
        if template:
            self.template = template

    def render(self, form, form_style, context, template_pack=TEMPLATE_PACK):
        formset = context[self.formset_name_in_context]
        return render_to_string(self.teplate, {'formset': formset})

表单集.html

{% load crispy_forms_tags %}

{% extends base.html %}

{{ 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|as_crispy_field}}
                </td>
            {% endfor %}
        </tr>
    {% endfor %}

{% block javascript %}
    <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 %}

尽管如此,创建表单看起来是这样的:

在此处输入图像描述

什么时候应该是这样的

在此处输入图像描述

控制台终端没有任何错误。

标签: djangopython-3.xdjango-formsformsetinline-formset

解决方案


推荐阅读