Python 为什么“模型”对象不可编辑?
我正在尝试仅在我的管理面板中添加radioselect。我使用多对多字段来连接另一个模型背景的对象 我现在有:收音机选择在这里,在管理面板上工作,但是当我继续并保存更改时,我得到了这个错误:“背景”对象是不可编辑的 如何将信息保存并保持为选中状态 MyApp/models.py MyApp/forms.py MyApp/admin.py 我无法调试这个问题,我很高兴知道它来自何处,以及如何解决它 编辑: 添加了回溯:Python 为什么“模型”对象不可编辑?,python,django,django-forms,django-admin,Python,Django,Django Forms,Django Admin,我正在尝试仅在我的管理面板中添加radioselect。我使用多对多字段来连接另一个模型背景的对象 我现在有:收音机选择在这里,在管理面板上工作,但是当我继续并保存更改时,我得到了这个错误:“背景”对象是不可编辑的 如何将信息保存并保持为选中状态 MyApp/models.py MyApp/forms.py MyApp/admin.py 我无法调试这个问题,我很高兴知道它来自何处,以及如何解决它 编辑: 添加了回溯: Traceback: File "C:\Python34\lib\site-p
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
您不能使用radio小部件来创建多对多关系,因为django需要一个背景id数组,这是django在堆栈跟踪中抱怨的,而不是在您将数据发布到FormOneAdmin添加视图时抱怨的单个背景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)
或者,如果仍然需要将零个或一个背景对象绑定到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
请发布完整的stacktrace。@Jean Françoisfare我添加了跟踪。
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
class FormOneForm(forms.ModelForm):
class Meta:
model = FormOne
fields = ['name', 'background']
# background = forms.ModelChoiceField(widget=forms.RadioSelect, queryset=Background.objects.all(), required=False)
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