gpt4 book ai didi

django - 使用内联表单中的额外字段 - save_model、save_formset,无法理解差异

转载 作者:行者123 更新时间:2023-12-02 00:57:46 25 4
gpt4 key购买 nike

假设我处于通常的情况,在多对多关系中有额外的字段:

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)

我想在成员(member)表单中添加一些通过内联显示的额外字段。这些字段基本上是另一个模型(Trip)实例化的快捷方式。旅行可以有自己的管理 View ,但需要这些快捷方式,因为当我的项目合作伙伴在系统中输入“成员(member)”数据时,他们碰巧也有方便的“旅行”信息(也因为成员(member)中的一些信息可以被复制到 Trip 等)。

所以我想要的只是成员(member)内联中的两个额外字段 - placeVisited 和 pleasuretrip - 与 Person 实例一起将让我在后台实例化 Trip 模型...

我发现我可以通过定义自己的表单轻松地将额外的字段添加到内联 View 中。但是输入数据后,如何以及何时引用它们以执行我需要执行的保存操作?

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,)

这似乎不起作用...我对 save_formset 方法也有点困惑...也许这是我应该使用的方法? 提前非常感谢的帮助!!!!

最佳答案

正如 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()

关于django - 使用内联表单中的额外字段 - save_model、save_formset,无法理解差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1574313/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com