2013-02-04 85 views
1

我很樂意將Django用於學校項目,但我遇到了幾個問題。TypeError:render_option()之後的參數必須是一個序列,而不是int

標題中描述了我需要幫助的人。基本上,我有一個todo應用程序,我可以添加任務。現在我在視圖中添加了一個表單讓用戶添加任務,但我無法訪問Django管理員中的任務。

我仍然可以用管理員,但每次我嘗試添加或通過管理員編輯任務,它拋出我這個錯誤的時間將其刪除:

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

但是,我增加了對用戶的作品形式好。

我的猜測是12我們可以看到url正在發生錯誤,但我不知道爲什麼。我指出我對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 %} 

回答

1
  1. 待辦事項/ models.py:刪除[]周圍PRIORITY_TYPES
  2. 待辦事項/ forms.py:更換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」的答案,其中包含一些示例代碼。

+0

嗨,感謝您的幫助,解決了我的問題。由於'PRIORITY_TYPES'的_complex_結構,Django無法獲得優先級字段的正確值嗎? –

+0

用'[]'包裹你的選擇是錯誤的,因爲你已經列出了一個列表。它產生了一個元組列表的列表。 ChoiceField只知道字符串。它在內部只產生一個'