mag*_*rth 6 forms django inline django-admin
假设我处于通常情况下,在many2many关系中有额外的字段:
class Person(models.Model):
name = models.CharField(max_length=128)
class Group(models.Model):
name = models.CharField(max_length=128)
members = models.ManyToManyField(Person, through='Membership')
class Membership(models.Model):
person = models.ForeignKey(Person)
group = models.ForeignKey(Group)
date_joined = models.DateField()
invite_reason = models.CharField(max_length=64)
# other models which are unrelated to the ones above..
class Trip(models.Model):
placeVisited = models.ForeignKey(Place)
visitor = models.ForeignKey(Person)
pleasuretrip = models.Boolean()
class Place(models.Model):
name = models.CharField(max_length=128)
Run Code Online (Sandbox Code Playgroud)
我想在会员表单中添加一些通过内联显示的额外字段.这些字段基本上是另一个模型(Trip)实例化的快捷方式.Trip可以拥有自己的管理员视图,但需要这些快捷方式,因为当我的项目合作伙伴在系统中输入"会员"数据时,他们碰巧也有"旅行"信息(并且还因为会员资格中的某些信息可能只是被复制到旅行等.).
因此,所有我想有在籍内嵌了两个附加字段- placeVisited和pleasuretrip -这与Person实例在一起会让我实例在后台旅行模式 ...
我发现通过定义自己的表单,我可以轻松地将额外的字段添加到内联视图中.但是一旦输入数据,如何以及何时引用它们以执行我需要执行的保存操作?
class MyForm(forms.ModelForm):
place = forms.ModelChoiceField(required=False, queryset=Place.objects.all(), label="place",)
pleasuretrip = forms.BooleanField(required=False, label="...")
class MembershipInline(admin.TabularInline):
model = Membership
form = MyForm
def save_model(self, request, obj, form, change):
place = form.place
pleasuretrip = form.pleasuretrip
person = form.person
....
# now I can create Trip instances with those data
....
obj.save()
class GroupAdmin(admin.ModelAdmin):
model = Group
....
inlines = (MembershipInline,)
Run Code Online (Sandbox Code Playgroud)
这似乎不起作用......我也对save_formset方法感到有些困惑......也许是我应该使用的那个?非常感谢您的帮助!!!!
pay*_*ala 14
正如syn在他的回答中指出的那样,对于TabularInline和StackedInline,你必须覆盖包含内联的ModelAdmin中的save_formset方法.
GroupAdmin(admin.ModelAdmin):
model = Group
....
inlines = (MembershipInline,)
def save_formset(self, request, form, formset, change):
instances = formset.save(commit=False)
for instance in instances:
if isinstance(instance, Member): #Check if it is the correct type of inline
if(not instance.author):
instance.author = request.user
else:
instance.modified_by = request.user
instance.save()
Run Code Online (Sandbox Code Playgroud)
我刚刚遇到了同样的问题,似乎解决方案是对于带有内联的 save_formset 和 save_model ,它们都不会被调用。相反,您必须在正在调用的父表单集中实现它,例如
model = Group
....
inlines = (MembershipInline,)
def save_formset(self, request, form, formset, change):
instances = formset.save(commit=False)
for instance in instances:
# Here an instance is a MembershipInline formset NOT a group...
instance.someunsetfield = something
# I think you are creating new objects, so you could do it here.
instance.save()
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5650 次 |
| 最近记录: |