【问题标题】:Django - Saving multiple selection boxes in one formDjango - 以一种形式保存多个选择框
【发布时间】:2018-02-19 07:19:18
【问题描述】:

我需要以一种形式保存多个选择,但它不会将值保存到我的模型中。这是表单的外观:

这是我的models.py

class ChoiceManager(models.Manager):
    def rates (self, Task_id, rating2, yo):
        assignment = Assignment.objects.get(id=Assignment_id)
        rating = rating2
        yo = FiscalYear.objects.get(fy_year=years)
        for i in range(len(rating2)):
            rated = Prog_capability.objects.create(
            task = task, 
            rating2 = rating[i],
            fy = yo[i]
        )

class NewYear(models.Model):
    year = models.CharField(max_length=5)
    new_year = models.CharField(max_length=5)

class Choice(models.Model):
    rating = models.CharField(max_length=255, blank=True, null=True)
    year = models.ForeignKey(NewYear, related_name="choices")
    assignment = models.ForeignKey(Assignment, related_name="choice")
    objects = ChoiceManager()

这是我的观点.py

def task_rating(request, Assignment_id):
    ratings = request.POST.getlist('rating2',[])
    years= request.POST.getlist('yo",[])
    rates= Choice.objects.rates(Assignment_id, ratings, years)
    return redirect ((reverse('Project:assignment_page', kwargs={'Assignment_id': Assignment_id})))

HTML

 <form action="{% url 'project:rating' %}" method="post">
      {% csrf_token %}
      {% for year in years %}
        <li class=cap_select>
          <div id=fyc>{{year.fy_year}}</div>
          <select name="rating2" id="{{assignment.id}}-{{year.id}}">
            <option>Choose From List</option>
            <option class=hi value="high">High</option>
            <option class=med value="medium">Medium</option>
            <option class=low value="low">Low</option>
            <option class=na value="n/a">N/A</option>
          </select> 
          <input type="hidden" name="yo" value={{year.fy_year}}>
        </li>  
      {% endfor %}
        <br>
        <input id=save_cap type="submit" value="Save">
      </form> 

我得到了一个

“不存在新年匹配查询。”并且无法保存数据。

我已经研究了几天了。任何帮助将不胜感激。

【问题讨论】:

    标签: python django django-models django-forms django-templates


    【解决方案1】:

    是的,你是对的

    POST 数据不是作为字典来的。

    您正在循环播放年份并在表单中呈现selectinput 标签,并且所有selectinput 标签的name 属性与ratingyear 相同

    在这种情况下,当您提交表单时,您将获得 ratingyear 的列表,因此您应该在从 request.POST QueryDict 获取它时使用 getlist() 方法。

    request.POST.getlist('rating[]')
    request.POST.getlist('year[]')
    

    如果上述方法不起作用,请使用它

    request.POST.getlist('rating', [])
    request.POST.getlist('year', [])
    

    更新您的费率方法,例如。

    class ChoiceManager(models.Manager):
        def rates (self, Assignment_id, rating, year):
            ...
            # you can use year also to find the length
            for i in range(len(rating)): 
               rated = Choice.create(
                  assignment = assignment, 
                  year = year[i],
                  rating = rating[i]
               )
    

    改变方法调用。

    rates = Choice.objects.rates(Assignment_id,request.POST.getlist('rating[]'), request.POST.getlist('year[]'))
    

    【讨论】:

    • 谢谢。好的。所以现在我得到:ValueError ...无法分配“[]”:“Choice.rating”必须是“Rating”实例。你提到的两个 getlist 都是一样的。
    • 您需要相应地更改您的费率方法
    • 您正在将列表传递给rates 并创建选择,但评级和年份是外键,不会分配给列表。
    • 我怎样才能保存这个表格呢?我是编程新手。非常感谢您的耐心等待。
    • 看到你正在传递列表,所以在创建 Choices 对象之前你需要循环它,所以它会在你的 rates 方法中创建多个选择对象
    【解决方案2】:

    所以这就是最后的工作:

    models.py

    class ChoiceManager(models.Manager):
    def rates (self, Assignment_id, rating2, years, rating_id):
        Assignment = Assignment.objects.get(id=Assignment_id)
        rating = rating2
        rating_id = rating_id
        for i in range(len(rating2)):
            year =NewYear.objects.get(fy_year=years[i])
            rated = Choice.objects.create(
            assignment = assignment, 
            rating = rating[i],
            fy = year,
            rating_id = rating_id[i]
        )
    

    views.py

    def task_rating(request, Assignment_id):
        ratings=  request.POST.getlist('rating2',[])
        years=  request.POST.getlist('yo',[])
        rating_id = request.POST.getlist('rating_id',[])
        rates = Choice.objects.rates(Assignment_id,ratings, years,rating_id)
        return redirect ((reverse('assignment:assignment_page', kwargs={'Assignment_id': Assignement_id})))
    

    HTML

    <form action="{% url 'project:rating' %}" method="post">
      {% csrf_token %}
      {% for year in years %}
          <select name="rating2" id="{{assignment.id}}-{{year.id}}">
            <option>Choose From List</option>
            <option class=hi value="high">High</option>
            <option class=med value="medium">Medium</option>
            <option class=low value="low">Low</option>
            <option class=na value="n/a">N/A</option>
          </select> 
          <input type="hidden" name="yo" value={{year.fy_year}}>
          <input type="hidden" name="rating_id" value="{{tasks.id}}-{{year.id}}">
      {% endfor %}
        <br>
        <input id=save_cap type="submit" value="Save">
      </form> 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-01-16
      • 2012-02-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-07
      • 1970-01-01
      • 2017-02-21
      相关资源
      最近更新 更多