如何解决Django:GenericInline与ModelMultipleChoiceField组合
嗨,我正在研究一种adminform,它可以选择一个现有对象或在GenericRelation的内联中添加一个新对象。请参见以下示例模型:
from stdimage
class Photograph(DeepZoom):
content_type = models.ForeignKey(ContentType,on_delete=models.CASCADE,null=True)
object_id = models.PositiveIntegerField(default=0)
profile = GenericForeignKey("content_type","object_id")
img = JPEGField(...)
img_alt = models.Charfield(max_lenght=300)
...
和
class MyProfile(models.Model):
name = models.CharField(max_length=200,default="")
photos = GenericRelation(Photograph,null=True)
为实现“选择现有”,我为管理网站编写了一个自定义表单
class SomeForm(forms.ModelForm):
choose_img = forms.ModelMultipleChoiceField(queryset=Photograph.objects.all(),required=False)
def __init__(self,*args,**kwargs):
super(SomeForm,self).__init__(*args,**kwargs)
self.initial.update({"choose_img": self.instance.photos.all()})
def save(self,commit=True):
chosen_imgs = set(self.cleaned_data.pop("choose_img"))
instance = super(SomeForm,self).save(False)
if commit:
instance.save()
current_imgs = set(instance.photos.all())
for img in chosen_imgs - current_imgs:
instance.photos.add(img)
for old_img in current_imgs - chosen_imgs:
old_img.profile = None
old_img.object_id = 0
old_img.save()
return instance
并将其与PhotographInline(基本上只是GenericTabularInline的一个实例)添加到管理站点
class MyProfileAdmin(admin.ModelAdmin):
form = SomeForm
inlines = [
PhotographInline,]
到目前为止一切顺利。在save
字段中选择Photograph
时,新的choose_img
方法可以达到我的期望。如果我取消选择Photograph
,它仍然可以工作,但是会将我重定向到显示“请更正以下错误”的管理员更改表单。并标记内联中最后一个条目的img
字段。对于此行,img
不会显示,但是如果我手动重新加载页面,则所有条目都将正确显示在内联中。
如果仔细查看第二行,则“ photograph / am_be_quelle.png”显示为灰色(第二行剩余的Photograph
),但是img_alt
是现在已分离的{{ 1}}(手动重新加载页面后,请参见下一张图片以获取正确的Photograph
)。
根据这种观察,我认为Inline数据在保存时未得到适当的更新。
我该如何修改它以便不会出现错误。
注意:
- 无法切换到
img_alt
字段。 - 如果对
ForeignKey
字段执行上述操作,则它不会出现任何问题。
--->必须与GenericInline有关
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。