2009-09-03 6 views
7

Есть ли способ переопределить метод сохранения для встроенной формы и родительского элемента одновременно?django admin overriding метод сохранения в строках?

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

спасибо :)

ответ

2

Одним из способов является крюк в `pre_save» сигнала вашей инлайн модели:

from django.db.models.signals import pre_save 
from your_app.models import YourModel 

def callback(sender, **kwargs): 
    # 'instance' is the model instance that is about to be saved, 
    # so you can do whatever you want to it. 
    instance.field = new_value 

pre_save.connect(callback, sender=YourModel) 

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

+0

+1 Для указания, что лучше переопределить метод 'save()' на модели! – Caumons

9

Чтобы настроить сохранение инлайнов, вы можете переопределить FormSet

class SomeInlineFormSet(BaseInlineFormSet): 
    def save_new(self, form, commit=True): 
     return super(SomeInlineFormSet, self).save_new(form, commit=commit) 

    def save_existing(self, form, instance, commit=True): 
     return form.save(commit=commit) 

class SomeInline(admin.StackedInline): 
    formset = SomeInlineFormSet 
    # .... 

Обратите внимание, что save_new() использует только форму, чтобы получить данные, он не позволяет ModelForm фиксации данных. Вместо этого он строит сама модель. Это позволяет вставить родительское отношение, так как они не существуют в форме. Вот почему переопределение form.save() не работает.

В случае родовых инлайн, метод form.save() никогда не вызываются, и form.cleaned_data используются вместо того, чтобы получить все значения, и Field.save_form_data() используются для хранения значений в экземпляре модели.


FYI, некоторые общие советы, чтобы изобразить эти вещи; очень полезно иметь IDE (или, возможно, конфигурацию vim или Sublime setup), что позволяет легко перейти к символьным определениям. Вышеприведенный код был вычислен, введя код inline/formet и посмотрев, что происходит. В случае с PyCharm, который работает, удерживая Command (или Ctrl) и нажимая на символ. Если вы пользователь vim, ctags может сделать для вас подобную вещь.

Смежные вопросы