我愿意将Django用于学校项目,但我遇到了几个问题。
标题中描述了我需要帮助的那个。基本上,我有一个 todo 应用程序,我可以在其中添加任务。现在我在我的视图中添加了一个表单以允许用户添加任务,我无法访问Django管理员中的任务。
我仍然可以使用管理员删除它们,但每次我尝试通过管理员添加或编辑任务时都会抛出这个错误:
TypeError at /admin/todo/task/12/`
render_option() argument after * must be a sequence, not int
但是,我为用户添加的表单效果很好。
我的猜测是12
我们可以看到网址出错,但我不知道为什么。我指出我仍然是Django的新手,我没有发现任何类似的问题(找到this但它没有帮助我)所以我觉得这可能是个好主意:) 。这是我的文件:
待办事项/ models.py
PRIORITY_TYPES = (
(1, 'Normal'),
(2, 'High'),
)
class Task(models.Model):
application = models.CharField(max_length=120, default='esportbets')
title = models.CharField(max_length=120)
author = models.CharField(max_length=60, blank=True, null=True)
created = models.DateTimeField(auto_now_add=True)
completed = models.DateTimeField(blank=True, null=True)
priority = models.IntegerField(choices=[PRIORITY_TYPES], default=1)
done = models.BooleanField(default=False)
def __unicode__(self):
return self.title
待办事项/ forms.py
class AddTaskForm(forms.Form):
application = forms.CharField(max_length=120, initial='esportbets', help_text='the application it is about')
title = forms.CharField(max_length=120, help_text='the task to do')
priority = forms.ChoiceField(choices=PRIORITY_TYPES, initial=1)
待办事项/ views.py
def index(request):
if request.method == 'POST':
form = AddTaskForm(request.POST)
if form.is_valid():
new_task = Task.objects.create(application=form.cleaned_data['application'],
title=form.cleaned_data['title'],
priority=form.cleaned_data['priority'])
request.POST = None
redirect('/todo/', RequestContext(request))
else:
form = AddTaskForm()
tasks = Task.objects.all().order_by('-created')
tasks_high = tasks.filter(priority=2)
tasks_normal = tasks.filter(priority=1)
template_datas = {'form':form, 'tasks_high':tasks_high, 'tasks_normal':tasks_normal, 'user':request.user}
return render_to_response('todo/base.html', template_datas, RequestContext(request))
待办事项/ base.html文件
{% if user.is_authenticated %}
<hr /><h3>ADD A TASK</h3><br />
<form method="post" action=".">
{% csrf_token %}
{{ form.as_p }}
<br />
<input type="submit" value="add" />
<input type="reset" value="reset" />
</form>
{% endif %}
答案 0 :(得分:1)
[]
周围的PRIORITY_TYPES
。forms.ChoiceField(...)
替换为forms.TypedChoiceField(choices=PRIORITY_TYPES, initial=1, coerce=int)
由于您实际上是将数据1:1从表单复制到模型,因此我建议您使用django.forms.ModelForm
。
如果您想进一步减少代码,可以使用通用CreateView。我最近写了一个“Best practices on saving in a view, based on example code”的答案,其中包含一些示例代码。