2016-12-25 6 views
2

管理パネルにradioselectを追加しようとしていますのみです。別のモデルのオブジェクトを接続するために、多対多フィールドを使用します(背景)。なぜ 'model'オブジェクトは反復可能ではありませんか?

私が今持っている何

ラジオ選択はここにあると管理パネル上で動作しますが、私は続行し、変更を保存するとき、私はこのエラーを取得:'Background' object is not iterable

情報を保存して選択したままにするにはどうすればよいですか?

のMyApp/models.py

class Background(models.Model): 
    bk_color = models.CharField(max_length=20) 
    ... 

class FormOne(models.Model): 
    name = models.CharField(max_length=40) 
    background = models.ManyToManyField(Background, blank=True) 
    ... 

のMyApp/forms.py

class FormOneForm(forms.ModelForm): 
    class Meta: 
     model = FormOne 
     fields = ['name', 'background'] 

    background = forms.ModelChoiceField(widget=forms.RadioSelect, queryset=Background.objects.all(), required=False) 

のMyApp/admin.py

class FormOneAdmin(ModelAdmin): 
    fields = ['name', 'background'] 
    form = FormOneForm 


site.register(Background) 
site.register(FormOne, FormOneAdmin) 

I cはouldn't問題をデバッグする、私はそれが来てどこから私はそれを解決することができますから知ってうれしいだろう?

EDIT:

追加トレースバック:

Traceback: 
File "C:\Python34\lib\site-packages\django\core\handlers\base.py" in get_response 
    132.      response = wrapped_callback(request, *callback_args, **callback_kwargs) 
File "C:\Python34\lib\site-packages\django\contrib\admin\options.py" in wrapper 
    618.     return self.admin_site.admin_view(view)(*args, **kwargs) 
File "C:\Python34\lib\site-packages\django\utils\decorators.py" in _wrapped_view 
    110.      response = view_func(request, *args, **kwargs) 
File "C:\Python34\lib\site-packages\django\views\decorators\cache.py" in _wrapped_view_func 
    57.   response = view_func(request, *args, **kwargs) 
File "C:\Python34\lib\site-packages\django\contrib\admin\sites.py" in inner 
    233.    return view(request, *args, **kwargs) 
File "C:\Python34\lib\site-packages\django\contrib\admin\options.py" in change_view 
    1521.   return self.changeform_view(request, object_id, form_url, extra_context) 
File "C:\Python34\lib\site-packages\django\utils\decorators.py" in _wrapper 
    34.    return bound_func(*args, **kwargs) 
File "C:\Python34\lib\site-packages\django\utils\decorators.py" in _wrapped_view 
    110.      response = view_func(request, *args, **kwargs) 
File "C:\Python34\lib\site-packages\django\utils\decorators.py" in bound_func 
    30.     return func.__get__(self, type(self))(*args2, **kwargs2) 
File "C:\Python34\lib\contextlib.py" in inner 
    30.     return func(*args, **kwds) 
File "C:\Python34\lib\site-packages\django\contrib\admin\options.py" in changeform_view 
    1470.     self.save_related(request, form, formsets, not add) 
File "C:\Python34\lib\site-packages\django\contrib\admin\options.py" in save_related 
    1102.   form.save_m2m() 
File "C:\Python34\lib\site-packages\django\forms\models.py" in save_m2m 
    102.     f.save_form_data(instance, cleaned_data[f.name]) 
File "C:\Python34\lib\site-packages\django\db\models\fields\related.py" in save_form_data 
    2603.   setattr(instance, self.attname, data) 
File "C:\Python34\lib\site-packages\django\db\models\fields\related.py" in __set__ 
    1266.   value = tuple(value) 

Exception Type: TypeError at /admin/multistepform/formone/75/ 
Exception Value: 'Background' object is not iterable 
+0

完全なスタックトレースを投稿してください。 –

+0

@ Jean-FrançoisFabreトラックトレースを追加しました。 –

答えて

0

Djangoはbackground IDの配列を期待しているので、あなたはそれはDjangoがで文句何(、多くの関係に多くのを作成するためにradio widgetを使用することはできませんあなたのスタックトレース)の代わりに、FormOneAdmin追加ビューにデータを投稿するときに、backgroundというIDを使用する必要はありません。

ModelChoiceFieldの行をコメントアウトすると、動作するようになります。それでもFormOneオブジェクトにのみ、ゼロまたは1 Backgroundオブジェクトのバインドを聞かせする必要がある場合

class FormOneForm(forms.ModelForm): 
    class Meta: 
     model = FormOne 
     fields = ['name', 'background'] 

    # background = forms.ModelChoiceField(widget=forms.RadioSelect, queryset=Background.objects.all(), required=False) 

それとも、あなたはForeignKey代わりのManyToManyField使用する必要があります。コードは次のようになります。

class FormOne(models.Model): 
    name = models.CharField(max_length=40) 
    # background = models.ManyToManyField(Background, blank=True) 
    background = models.ForeignKey(Background, blank=True) # <-- use foreign key instead 


class FormOneForm(forms.ModelForm): 
    class Meta: 
     model = FormOne 
     fields = ['name', 'background'] 

    background = forms.ModelChoiceField(widget=forms.RadioSelect, queryset=Background.objects.all(), required=False) 


class FormOneAdmin(admin.ModelAdmin): 
    fields = ['name', 'background'] 
    form = FormOneForm 
関連する問題