2011-10-23 1 views
0

장고에 사용자가 범주 목록에서 선택할 수있는 ChoiceField가 포함 된 간단한 양식을 작성 중입니다. 확실히 처리 할 category_id를 전달하고 싶습니다. 이건 내 코드입니다 :Django ChoiceField 또는 TypedChoiceField 및 유효하지 않은 ID 선택

models.py :

class AddProductForm(forms.Form): 
    category = forms.ChoiceField(label=_('Category')) 
    product = forms.CharField(label=_('Product'), widget=forms.TextInput()) 
    code = forms.CharField(label=_('Code'), widget=forms.TextInput()) 
    price = forms.DecimalField(label=_('Price')) 

는 이제 views.py에서 내가 선택을 작성

class Category(models.Model): 
     category = models.CharField(max_length=128) 

     def __unicode__(self): 
      return self.category 


class Product(models.Model): 
     code = models.CharField(max_length=75) 
     name = models.CharField(max_length=128) 
     price = models.DecimalField(max_digits=7, decimal_places=2) 
     category = models.ForeignKey(Category) 

     def __unicode__(self): 
      return self.name 

forms.py : 이제

def add_product_form(request): 
    form = AddProductForm() 

    form.fields['category'].choices =[(c.id, c.category) for c in Category.objects.all()] 

    return render_to_response('product-form.html', {'form':form}) 

양식을 제출할 때를 제외하고 모든 것이 괜찮은 것 같습니다. 카테고리의 ID에 대해 불평합니다. 그것은 말합니다 : 유효한 선택을 선택하십시오.

def add_product(request): if request.method == 'POST': form = AddProductForm(request.POST) if form.is_valid(): category = request.cleaned_data['category'] product = form.cleaned_data['product'] code = form.cleaned_data['code'] price = form.cleaned_data['price'] product = Product(code=code, name=product, price=price, category_id=category) product.save() return HttpResponseRedirect('/ms-admin/') else: form = AddProductForm() # more is required here to fill the choices again return render_to_response('product-form.html', {'form':form}) 

나는 TypedChoiceField와 같은 시도했지만 같은 잘못된 데이터를 가지고 : 1

이 내가 양식을 처리하고 어떻게 가능한 선택 중 하나가 아닙니다. 문자열과 int와 유니 코드 사이의 변환과 관련이 있다는 것을 알고 있습니다. 설명해 주시겠습니까?

답변

2

어떤 이유인지, 선택을 추가하는 것을 포함하여 양식을 렌더링하는보기와 제출을 처리하는보기를 분리했습니다. 제출시 선택 사항을 추가하지 않으므로 값은 유효하지 않습니다.

add_product_form보기를 모두 제거해야합니다. form.fields['category'].choices... 비트를 add_product보기로 이동할 수 있지만 더 좋은 해결책은 모델 또는 쿼리 세트에서 선택할 수 있도록 특별히 설계된 양식 필드 (예 : ModelChoiceField)를 사용하는 것입니다.

그냥 사용

category = forms.ModelChoiceField(model=Category) 

양식 정의에.

0

감사합니다. Daniel. 난 오래 전에 장고를 배우기 시작했고, 필자는 폼을 표시하는보기를 추가하는 경향이 있는데, 이는 필요하지 않습니다. 그래, 나는 add_product_form을 없애고 add_product에만 의존했다. 이제 카테고리 선택 필드로는 forms.py에 다음과 같이 코딩 :

forms.py :

from django import forms 
from django.utils.translation import ugettext_lazy as _ 

from myapp.models import Category 

class AddProductForm(forms.Form): 
    category = forms.ModelChoiceField(label=_('Category'), queryset=Category.objects.all()) 
    product = forms.CharField(label=_('Product'), widget=forms.TextInput()) 
    code = forms.CharField(label=_('Code'), widget=forms.TextInput()) 
    price = forms.DecimalField(label=_('Price')) 

views.py :

def add_product(request): 
    if request.method == 'POST': 
     form = AddProductForm(request.POST) 

     if form.is_valid(): 
     category = request.POST['category'] 
     product = form.cleaned_data['product'] 
     code = form.cleaned_data['code'] 
     price = form.cleaned_data['price'] 

     product = Product(code=code, name=product, price=price, category_id=category) 

     product.save() 

     # redirect to 'ms-admin/category_id' (the category to which belongs the newly added product 
     return HttpResponseRedirect('/ms-admin/'+category) 
    else: 
     form = AddProductForm() 

    return render_to_response('product-form.html', {'form':form}) 

내가이 신규 이민자 도움이되기를 바랍니다 장고. 위의 코드를 개선하는 방법을 언급 해 주시기 바랍니다.