2016-04-28 13 views
0

ユーザがdjangoの管理者に関連する(インライン)データを保存して外部APIを呼び出すときに傍受する必要があります。私は親と子としてHostelGuestとエントリーポイントと同じページのホステルに持ってadmin.pyでDjango admin - save_related()を使用してインラインフォームのデータを解析するにはどうすればよいですか?

class Hostel(models.Model): 
    name = models.CharField(max_length=50) 
    descr = models.CharField(max_length=200) 
    .... 

class User(models.Model): 
    name = models.CharField(max_length=50, blank=False) 
    nick = models.CharField(max_length=20, blank=False) 
    password = models.CharField(max_length=20, blank=False) 

class HostelGuest(models.Model): 
    hostel = models.ForeignKey(Hostel) 
    guest = models.ForeignKey(User) 
    entry_date = models.DateTimeField(null=True,blank=True) 

class HostelEntryPoint(models.Model): 
    hostel = models.ForeignKey(Hostel) 
    getting_here = models.CharField(max_length=300, blank=False) 
    distance = models.CharField(max_length = 30, blank = True) 

: は、私は次のモデルを持っています。 HostelGuestの一部のデータが変更されるたびに、追加/削除/更新かどうかを調べ、外部APIを呼び出す必要があります。私はsave_related()を使用することを考えましたが、受信したデータを解析して、実行されたアクションを把握することができません。これは私が持っている限り、どんな助けも大いに評価されるでしょう!

class HostelEntryPointInline(admin.TabularInline): 
    model = HostelEntryPoint 
    extra = 3 

class HostelGuestInline(admin.TabularInline): 
    model=HostelGuest 
    extra=4 

class HostelAdmin(admin.ModelAdmin): 
    inlines = [HostelGuestInline, HostelEntryPointInline] 

    def save_related(self, request, form, formsets, change): 
     super(HostelAdmin, self).save_related(request, form, formsets, change) 
     logger = logging.getLogger(__name__) 
     obj = form.instance 
     obj.save() 
     for formset in formsets: 
      for f in formset: 
       logger.error('form name:' + f.__class__.__name__) 
       logger.error('form:' + f.cleaned_data['guest']) 

admin.site.register(Hostel,HostelAdmin) 

答えて

1

admin.TabularInlineにはFormを使用できます。

これは例です。

class HostelGuestForm(forms.ModelForm): 
    # set your code. 

class HostelGuestInline(admin.TabularInline): 
    model=HostelGuest 
    form = HostelGuestForm 
    extra=4 

外部APIを呼び出す場合は、これが解決策の1つです。 あなたclass HostelAdmin

def save_formset(self, request, form, formset, change): 
    if formset == formset_factory(HostelGuestForm): 
     # this `if` is check for formset is for HostelGuest 
     instances = formset.save(commit=False) 
     # it returns your added, changed, deleted instance 
     # if you don't have to check that instance is added or changed or deleted, below code is not required. 
     for instance in instances: 
      if instance.pk == None: 
       # this is added 
      elif: 
       # check `change` for is changed or deleted 
     formset.save_m2m() 
    else: 
     pass 

に入力する必要がありますdef save_formset()save_related()によって呼び出され、約がsave_related変更しない理由は、変更save_formsetは、他のinline formためです。インラインフォームセットはHostelGuestだけでなく、追加することも可能です。

+0

どのように値が追加/更新/削除されたかを、私はどのようにしてHostelGuestで知ることができますか? – LeandroG

+0

@LeandroGどの値が変更されたかはわかりません。管理者の場合、あなたのホステルオブジェクトを保存すると、obj.save_related()はHostelGuestを保存するように呼び出されます。 – beCurious

+0

あなたは更新するか、追加または削除することができますあなたのHostelGuestだけHostelGuestFormを作る。この[document](https://docs.djangoproject.com/es/1.9/topics/forms/modelforms/#the-save-method)とこの[document](https://docs.djangoproject.com/es)を参照してください。 /1.9/ref/contrib/admin/#django.contrib.admin.ModelAdmin.save_related) – beCurious

関連する問題