0

我有一个包含不同字段的“父”模型,其中一个是指向另一个模型的 ManyToMany 字段(该模型又具有多个字段)。

我想显示一个 ModelChoiceField ,其中包含“父”模型具有的 ManyToMany 对象的名称。

模型.py

class Media(models.Model):
    name = models.CharField(max_length=20, default='')
    ident = models.CharField(max_length=20, default='')
    def __unicode__(self):
        return self.name

class Parent(models.Model):
    name = models.CharField(max_length=200, default='')
    media = models.ManyToManyField(Media)
    def __unicode__(self):
        return self.name

为此,在 views.py 我有:

l = Parent.objects.all().order_by('name')
for parent in l:
    if parent.name == unicode(request.session['current_parent']) 
        break
m = forms.ModelChoiceField(parent.media.all(), widget=forms.Select())
return render_to_response('tab.html', {'media_list':m}) 

但是我在我的 html 中看到的是这句话:<django.forms.models.ModelChoiceField object at 0x03294570>

我应该怎么做才能正确呈现列表?

4

1 回答 1

1

您不能只显示一个表单域。它实际上必须是表单的一部分,您必须在将其传递给模板之前对其进行实例化。

另请注意,您获取父级的方法非常低效:您实例化数据库中的每个父级,只是为了获得一个。您应该直接查询它。

class ParentForm(forms.Form):
     media = forms.ModelChoiceField(Media.objects.none(), widget=forms.Select())
     def __init__(self, *args, **kwargs):
         parent = kwargs.pop('parent')
         super(ParentForm, self).__init__(*args, **kwargs)
         self.fields['media'].queryset = parent.media.all()

def my_view(request):
    parent = Parent.objects.filter(name=request.session['current_parent'])
    form = ParentForm(parent=parent)
    return render_to_response('tab.html', {'media_form': form}) 

或者,将父对象传递给模板然后手动构造选择框可能更容易:

 <select name='media'>
 {% for media in parent.media.all %}
     <option value='{{ media.ident }}'>{{ media.name }}</option>
 {% endfor %}
 </select>
于 2013-07-05T09:18:52.097 回答