简体   繁体   中英

Django/Python: ValueError at /foo/bar

I'm having some issues with django forms. This is the error I'm getting:

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,
})

I tried to fix the problem with "form.data['category'] = Category.objects.get(pk=form.data['category']),", but that's not going to do it.

Does anyone have a better idea? Thanks a lot.

EDIT: Traceback shows that the error happens at

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

EDIT2: This might explain better, why django forms doesn't work with the "default" programming:

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'

try this

get_cat_name =  form.cleaned_data['category']

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

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

Normally you do not need related Category object, just giving the cleaned_data is enough and the right way to go.

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

Or if you have to work with related category id, then each ForeignKey model field can be used as <field_name>_id . But you must give a valid foreignkey, not the related object.

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

You can try

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

The form.cleaned_data would have category instance.

However, much recommended way is to just save the form as

my_course = form.save()

If you want to manually change some fields, do

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM