2016-12-25 25 views
2

Я пытаюсь добавить радиоселекцию в свою панель администратора только. Я использую много-много полей для подключения объектов другой модели (Background).Почему объект «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:

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

Вы не можете использовать radio widget для создания многие ко многим отношений, потому что Джанго ожидает массив background идентификатора (это то, что Джанго жалуется на ваша трассировка стека) вместо одного background id при отправке данных в файл добавления FormOneAdmin.

Вы можете прокомментировать строку 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 
Смежные вопросы