1

我愿意将 Django 用于学校项目,但我遇到了几个问题。

标题中描述了我需要帮助的那个。基本上,我有一个待办事项应用程序,我可以在其中添加任务。现在我在视图中添加了一个表单以让用户添加任务,我无法访问 Django 管理员中的任务。

我仍然可以使用管理员删除它们,但是每次我尝试通过管理员添加或编辑任务时,它都会向我抛出此错误:

TypeError at /admin/todo/task/12/`
render_option() argument after * must be a sequence, not int

但是,我为用户添加的表单效果很好。

我的猜测是12我们可以看到 url 正在出错,但我不知道为什么。我指出我对 Django 还是有点陌生​​,我没有发现任何类似的问题(发现了这个但它对我没有帮助)所以我认为在这里问可能是个好主意:)。这是我的文件:

待办事项/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 %}
4

1 回答 1

1
  1. todo/models.py:删除[]周围的PRIORITY_TYPES.
  2. todo/forms.py:forms.ChoiceField(...)替换forms.TypedChoiceField(choices=PRIORITY_TYPES, initial=1, coerce=int)

由于您实际上是将数据 1:1 从表单复制到模型,因此我建议使用django.forms.ModelForm.

如果您想进一步最小化您的代码,您可以使用通用的CreateView我最近写了一篇“基于示例代码保存在视图中的最佳实践”的答案,其中包括一些示例代码。

于 2013-02-04T18:05:21.763 回答