Python Django-在一个表单中保存多个选择框
我需要在一个表单中保存多个选择,但它不会将值保存到我的模型中。以下是表单的外观: 这是我的模特Python Django-在一个表单中保存多个选择框,python,django,django-models,django-forms,django-templates,Python,Django,Django Models,Django Forms,Django Templates,我需要在一个表单中保存多个选择,但它不会将值保存到我的模型中。以下是表单的外观: 这是我的模特 class ChoiceManager(models.Manager): def rates (self, Task_id, rating2, yo): assignment = Assignment.objects.get(id=Assignment_id) rating = rating2 yo = FiscalYear.objects.g
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()
这是我的观点
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
{%csrf_令牌%}
{年份百分比,以年为单位%}
{year.fy_year}
从列表中选择
高
中等
低
不适用
{%endfor%}
我得到一份工作
“新年匹配查询不存在。”并且无法保存数据
这件事我已经谈了好几天了。任何帮助都将不胜感激 是的,你是对的
POST数据不是作为字典提供的
您正在循环年份并在表单中呈现select
和input
标记,所有select
和input
标记的name
属性与rating
和year
标记相同
在这种情况下,当您提交表单时,您将得到一个评级
和年份
的列表,因此您应该使用getlist()
方法从request.POST QueryDict中获取它
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[]'))
因此,这就是最终起作用的原因: 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()
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
{%csrf_令牌%}
{年份百分比,以年为单位%}
从列表中选择
高
中等
低
不适用
{%endfor%}
谢谢。好啊现在我得到:ValueError…无法分配“[]”:“Choice.rating”必须是“rating”实例。你提到的两个getlist都是一样的。你需要根据你正在将列表传递到rates
并创建选项来更改你的rates方法,但是rating和year是外键,它不会与list一起分配。那么我如何保存此表单?我是编程新手。非常感谢您的耐心。请看,您正在传递列表,因此在创建选项对象之前,您需要在列表上循环,这样它将在您的rates方法中创建多个选项对象
<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>