代码之家  ›  专栏  ›  技术社区  ›  Akash Rathor

如果我们点击添加更多按钮并将其存储在django中,如何循环一个表单并在djanga中添加相同的表单

  •  0
  • Akash Rathor  · 技术社区  · 5 年前

    我真正想做的是,如果用户点击“添加更多”按钮,则相同的表单会重复出现,值应该存储在数据库中,如果他/她没有点击该按钮,则只应存储第一个表单中的值。

    我无法理解这一点,我刚刚创建了一个表单,并在数据库中为这些详细信息创建了一张表,但无法在表单和数据中循环。

    请帮忙。

    This is the form and the button:

    这是model.py代码:

    from django.db import models
    
    class experience(models.Model):
        company_name = models.CharField(max_length=100)
        address = models.CharField(max_length=100)
        startdate = models.Datefield(default = 01-01-2020)
        lastdate = models.DateField(default = 01-01-2020)
        profile = models.CharField(max_length=100)
        description = models.TextField(max_length = 250)
    

    这是views.py代码:

    from django.shortcuts import render, redirect
    import requests
    from django.contrib.auth.models import User, auth
    
    
    # Create your views here.
    def profile(request):
    
        return render(request, 'profile.html')
    
    0 回复  |  直到 5 年前
        1
  •  0
  •   carlos rocha    5 年前

    不幸的是,据我所知,Django中没有内置的方法可以在没有Javascript的情况下做到这一点,但有一种方法:

    HTML:

    <div class="container" id="experiencesContainer">
      <form method='POST' name='experienceForm'>
        {{form.as_p}}
        </form>
       <form method='POST' name='experienceForm'>
        {{form.as_p}}
        </form>
      <button type="button" id="addMoreButton">Add more</button>
      <button type="submit">Save Changes</button>
    </div>
    

    Django POST方法:

    # Get a list of submitted forms
    experiences = request.POST.getlist('experienceForm')
    for experience in experiences:
        # this is how you loop throuh every form
        experience.get('company_name)
    

    你的javascript类似于:

    // clonning his childs as well
    let cloneForm = document.querySelector('form[name=experienceForm]').cloneNode(true);
    document.querySelector('div#experiencesContainer').appendChild(cloneForm);
    // see this https://www.w3schools.com/jsref/met_node_clonenode.asp
    

    当然,这段代码没有经过测试,但我以前在几个项目中做过,希望它能奏效!

        2
  •  0
  •   Rohit Nair    5 年前

    一个简单的方法是从“Add”请求相同的视图,只要确保您的表单视图在请求方法为POST时保存数据。

    <form action="{% url 'your-form-url' %}" method="GET">
            {% csrf_token %}
            <input type="submit" value="Add">
    </form>
    

    另一种重复表单的方法是使用 formsets 表单集允许您“额外”重复相同的表单。 查看文档以了解更多信息。

    def repeat_form(request):
        ExpFormSet = formset_factory(ExperienceForm, extra=3)
        #extra defines the no. of forms you want to display
        if request.method == 'POST':
            formset = ExpFormSet(request.POST, request.FILES)
    
            if formset.is_valid():
                # do something with the formset.cleaned_data
                #loop through each form in the formser
                for form in formset.cleaned_data:
                    obj = form.save()
    
        else:
            formset = ExpFormSet()
        return render(request, 'exp_form.html', {'formset': formset})
    

    相应的模板应该是:-

    <form method="post">
        {{ formset.management_form }}
            {% for form in formset %}
            {{ form.as_p }}
            {% endfor %}
    </form>
    

    确保您添加了form.management_form。使用上述组合可能会解决您获取和保存多个输入的问题。