2012-09-05 104 views
0

我在使用django表单时遇到了一些问题。这是我得到的错误:Django/Python:ValueError at/foo/bar

ValueError at /coach/new/ 
Cannot assign "u'7'": "Course.category" must be a "Category" instance. 

views.py

def create_course_page(request): 
if request.method == 'POST': # If the form has been submitted... 
    form = CreateCourseForm(request.POST) # A form bound to the POST data 
    #form.data['category'] = Category.objects.get(pk=form.data['category']), 
    if form.is_valid(): # All validation rules pass 
     cleaned_data = form.cleaned_data 
     my_course = Course(
      title = cleaned_data['title'], 
      prerequisite = cleaned_data['prerequisite'], 
      category = Category.objects.get(pk=cleaned_data['category']), 
      short_description = cleaned_data['short_description'], 
      #listing_city = cleaned_data['xxxx'], 
      date_created = datetime.now(), 
      date_last_updated = datetime.now(), 
      teacher = request.user, 
     ) 
     my_course.save() 
     return HttpResponseRedirect('/') # Redirect after POST 
    else: 
     return HttpResponseRedirect('/wtf') # Redirect after POST 
else: 
    my_course = Course() 
    form = CreateCourseForm(instance=my_course) # An unbound form 

return render(request, 'learn/new_course.html', { 
    'form': form, 
}) 

我试图用“form.data [ '类'] = Category.objects.get解决这个问题(PK = form.data ['category'])“,但这不会做到。

有没有人有更好的主意?非常感谢。

编辑: 回溯显示错误在

if form.is_valid(): # All validation rules pass 

EDIT2情况: 这可能更好地解释,为什么Django的形式不与 “默认” 的编程工作:

forms.py

def categories_as_choices(): 
categories = [(u'', u'')] # So select box get's an empty value/default label 
for category in Category.objects.all(): 
    new_category = [] 
    sub_categories = [] 
    for sub_category in category.get_children(): 
     sub_categories.append([sub_category.id, sub_category.name]) 

    new_category = [category.name, sub_categories] 
    categories.append(new_category) 
return categories 

class CreateCourseForm(ModelForm): 
category = forms.ChoiceField(choices=categories_as_choices()) #chzn-select 
class Meta: 
    model = Course 
    fields = ('title', 'category') 

def __init__(self, *args, **kwargs): 
    super (CreateCourseForm, self).__init__(*args, **kwargs) 
    self.fields['category'].widget.attrs['class'] = 'chzn-select' 

回答

0

试试这个

get_cat_name = form.cleaned_data['category'] 

get_obj = Category.objects.get(category = get_cat_name) 

category = get_obj.id 
0
category = Category.objects.get(pk=cleaned_data['category']) 

通常你不需要相关Category对象,只是给了cleaned_data是足够和正确的方式去。

my_course = Course(......, category = cleaned_data['category'], ...) 

或者,如果您有相关的类ID工作,那么每ForeignKey示范田可以作为<field_name>_id。但是你必须给出一个有效的外键,而不是相关的对象。

my_course = Course(......, category_id = 8, ...) 
0

您可以尝试

my_course = Course(..., category = form.cleaned_data['category']), ...) 

form.cleaned_data将有类别实例。

然而,许多建议的方法是只在窗体保存为

my_course = form.save() 

如果你想手动更改某些领域,做

my_course = form.save(commit=False) 
my_course.some_field = some_value 
... 
my_couse.save() 
+0

已经试过了。我认为这个问题在forms.is_valid()方法中。 –