2013-03-24 36 views
8

Tôi có một biểu mẫu với một ModelChoiceField, và tôi muốn tải nó trên một bảng từ DB của tôi. Nếu tôi sử dụng queryset này trên init hình thức của tôi, sau đó nhìn tôi form.is_valid hoạt động tốt:Django - Cách hoạt động của bộ truy vấn ModelChoiceField?

self.fields['categoria_formfield'].queryset = sitio_categoria.objects.exclude(categoria='patrimonio').values_list('idCategoria',flat=True) 

enter image description here

Đó là mã hiển thị danh sách của id trên ModelChoiceField, nhưng những gì tôi cần nó để hiển thị các loại danh sách. Vì vậy, tôi sử dụng:

self.fields['categoria_formfield'].queryset = sitio_categoria.objects.exclude(categoria='patrimonio').values_list('categoria',flat=True) 

Nhưng sử dụng mã này .is_valid không xác nhận và i recive một lỗi dạng: "Chọn một lựa chọn hợp lệ lựa chọn Đó không phải là một trong những lựa chọn sẵn.." Một số đầu mối về những gì có thể là vấn đề?

Error recived

MODEL

class sitio_categoria(models.Model): 
    idCategoria   = models.AutoField(primary_key=True) 
    categoria   = models.CharField(max_length=30, null=False, unique=True) 

MẪU

class anadirComercioPaso1_form(forms.Form): 
     categoria_formfield = forms.ModelChoiceField(widget=forms.Select(attrs={'size':'13', 'onchange':'this.form.action=this.form.submit()'}), queryset=sitio_categoria.objects.none()) 

def __init__(self, *args, **kwargs): 
     super(anadirComercioPaso1_form, self).__init__(*args,**kwargs) 
     self.fields['categoria_formfield'].queryset = sitio_categoria.objects.exclude(categoria='patrimonio').values_list('categoria',flat=True) 

Trả lời

13

Không sử dụng values_list, (hoặc values), ModelChoiceField cần đối tượng mô hình thực tế.

queryset = sitio_categoria.objects.exclude(categoria='patrimonio') 

 

ModelChoiceField sẽ sử dụng các phím chính của các đối tượng để xác nhận và đại diện của họ unicode để hiển thị. Vì vậy, bạn sẽ cần phải xác định việc chuyển đổi sang Unicode trong mô hình của bạn:

class sitio_categoria(models.Model): 
    idCategoria = models.AutoField(primary_key=True) 
    categoria = models.CharField(max_length=30, null=False, unique=True) 

    def __unicode__(self): 
     return self.categoria 

 

ModelChoiceField documentation

The __unicode__ method of the model will be called to generate string representations of the objects for use in the field’s choices;

Các vấn đề liên quan