Formset in Django Classbased CreateView

让人想犯罪 __ 提交于 2020-06-27 03:57:05

问题


Model

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)

Views

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

What I need is to process a view similar to following image ,

NB: I am not good in js so i want a solution without the use of JS


回答1:


CREATE FORMS.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"

In Your Templates

<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> 



回答2:


Views

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/')

Forms

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,)

Template

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


来源:https://stackoverflow.com/questions/56087609/formset-in-django-classbased-createview

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!