0

さまざまなフィールドを含む「親」モデルがあり、そのうちの 1 つは別のモデルを参照する ManyToMany フィールドです (複数のフィールドがあります)。

「親」モデルが持つ ManyToMany オブジェクトの名前を含む ModelChoiceField を表示したいと思います。

models.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

フォーム フィールドを単独で表示することはできません。これは実際にはフォームの一部である必要があり、テンプレートに渡す前にインスタンス化する必要があります。

また、親を取得する方法は非常に非効率的であることに注意してください。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 に答える