Работая с дополнительными полями во Встроенной форме - save_model, save_formset, не может понять различие

Предположим, что я нахожусь в обычной ситуации, где существуют дополнительные поля в 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)

Я хочу добавить некоторые дополнительные поля в форме Членства, которая отображена через Встроенное. Эти поля в основном являются ярлыком на инстанцирование другой модели (Прохождение). Прохождение может иметь свои собственные администраторские представления, но эти ярлыки необходимы, потому что, когда мои партнеры проекта вводят данные 'Членства' в систему, у них, оказывается, есть также удобная информация 'о Прохождении' (и также потому что часть информации в Членстве может просто быть скопирована для Смещения и т.д. и т.д.).

Таким образом, все, что я хочу иметь, является двумя дополнительными полями во Встроенном Членстве - placeVisited и pleasuretrip - который вместе с экземпляром Человека позволит мне инстанцировать модели Trip в фоновом режиме...

Я узнал, что могу легко добавить дополнительные поля к встроенному представлению путем определения моей собственной формы. Но после того как данные были введены, как и когда сослаться им для выполнения операций сохранения, которые я должен сделать?

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 методом..., возможно, то, что тот я должен использовать? Большое спасибо заранее за справку!!!!

6
задан magicrebirth 16 October 2009 в 07:22
поделиться

2 ответа

Я только что столкнулся с той же проблемой, и, похоже, решение состоит в том, что и для 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()
2
ответ дан 8 December 2019 в 14:44
поделиться

Как указывает син в своем ответе, для TabularInline и StackedInline вы должны переопределить метод save_formset внутри ModelAdmin, который содержит встроенные строки.

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()
14
ответ дан 8 December 2019 в 14:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: