2016-12-25 98 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不能调试问题,我很高兴知道它将来到哪里以及我如何解决它?

编辑:

新增追踪:

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

请发布完整的stacktrace。 –

+0

@ Jean-FrançoisFabre我添加了轨迹。 –

回答

0

不能使用radio widget创建多对多关系,因为Django是期待background ID的数组(这就是Django的诉说您的堆栈跟踪)而不是发布数据到FormOneAdmin添加视图时的单个background ID。

你可以注释掉ModelChoiceField的行,你会得到它的工作。

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

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

或者,如果你仍然需要让只有零个或一个Background对象绑定到FormOne对象,你应该使用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 
相关问题