【问题标题】:Formset in Django Classbased CreateViewDjango 基于类的 CreateView 中的表单集
【发布时间】:2019-05-11 05:52:35
【问题描述】:

型号

class Timetable(models.Model):
    day = models.CharField(max_length=9,choices=timetable_choices)
    start = models.IntegerField()
    end = models.IntegerField()
    period = models.CharField(max_length=12)

观看次数

class Timetableadding(CreateView):
    model =  Timetable
    fields = ['day','period','start' ,'end']
    success_url = '/dashboard'

我需要处理类似于下图的视图,

注意:我不擅长 js,所以我想要一个不使用 JS 的解决方案

【问题讨论】:

    标签: python django django-models django-forms


    【解决方案1】:

    观看次数

    class Timetableadding(CreateView):
        model =  Timetable
        success_url = '/dashboard/'
        form_class = Timetableform
        template_name = 'form.html'
    
    
        def get_context_data(self, **kwargs):
            context = super(Timetableadding, self).get_context_data(**kwargs)
            context['formset'] = TimetableFormSet(queryset=Timetable.objects.none())
            context['day_form'] = DayForm()
            return context
    
        def post(self, request, *args, **kwargs):
            formset = TimetableFormSet(request.POST)
            day_form = DayForm(data=request.POST)
            if formset.is_valid() and day_form.is_valid():
                return self.form_valid(formset,day_form)
    
        def form_valid(self, formset,day_form):
            day = day_form.cleaned_data['day']
            instances = formset.save(commit=False)
            for instance in instances:
                instance.day = day
                instance.save()
            return HttpResponseRedirect('/dashboard/')
    

    表格

    class DayForm(Form):
        day = ModelChoiceField(queryset=Day.objects.all())
    
    
    class Timetableform(ModelForm):
        class Meta:
            model = Timetable
            fields = ( 'day','start', 'end', 'period')
    
    TimetableFormSet = modelformset_factory(Timetable, fields=('start', 'end', 'period'),extra=8,)
    

    模板

    {% csrf_token %}
    {{ day_form }} <br>
    {{ formset.management_form }}
    {% for form in formset %}
    {{ form }}<br><br>
    {% endfor %}
    

    【讨论】:

    • 但是您如何使用此解决方案处理内联表单中的错误?
    • 如果formset无效,post函数什么也不返回。
    【解决方案2】:

    创建表单.PY

    class MyForm(ModelForm): 
        class Meta:
            model = Timetable
            fields = ['day','start','end','period',]
    

    Views.py

    ​​>
    from django.forms import formset_factory  
    class YourView(CreateView):
        form = formset_factory(MyForm)
        model = Timetable
        success_url ="Your success url"
        template_name = "your template"
    
    

    在您的模板中

    <form method="post">{% csrf_token %}
        <fieldset>
            <div class="row">
                <div class="form-group col-lg-12">             
                    {{ form.management_form }}                                          
                    {% for contact in form %}
                    <div class="link-formset">
                        {{ contact.as_p }}
                    </div>
                    {% endfor %}
                    <button class="user-sent" type="submit" value="Send"> Send</button>
                </div>
            </div>    
        </fieldset>
        <script src="{% static 'forms/jquery.formset.js' %}"></script> 
        <script>
            $('.link-formset').formset({
                addText: '<i class="fa fa-plus"></i> Add User',
                deleteText: '<i class="fa fa-trash-o"></i>Remove'
            });
        </script>
    </form> 
    

    【讨论】:

    • 答案不起作用。我无法理解。如果您以更舒适的方式发布答案并提供一些解释会更好
    • 告诉我你到底想要实现什么。使用表单集。
    • 请与我分享你得到的输出截图。
    • 正如我在问题中所说并在屏幕截图中显示的那样,我希望用户只添加一天,其余字段添加 8 次。我看到了类似的使用功能视图。有没有可能使用 CBV 。您提供的模板仅呈现发送按钮
    • 分享功能视图。
    猜你喜欢
    • 2015-07-26
    • 2015-03-08
    • 2021-06-26
    • 2018-11-30
    • 2017-11-07
    • 2018-03-26
    • 2014-01-22
    • 1970-01-01
    • 2021-09-15
    相关资源
    最近更新 更多