2016-04-28 261 views
0

我需要在用户保存django admin中的相关(内联)数据以调用外部API时拦截。 我有以下型号:Django管理员 - 我如何使用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) 

在admin.py我在同一页旅馆为家长和HostelGuest和入口点为儿童。每当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,这是解决方案之一。 应键入您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。因为内联formset不仅可以添加HostelGuest

+0

如何判断HostelGuest中添加/更新/删除了哪些值? – LeandroG

+0

@LeandroG你不必告诉哪些值已经改变。在管理中,如果你保存你的旅馆对象,obj.save_related()将被调用以保存HostelGuest。 – beCurious

+0

所以,你可以更新或添加或删除你的Hostelguest只是使HostelGuestForm。看到这个[文档](https://docs.djangoproject.com/es/1.9/topics/forms/modelforms/#the-save-method)和这个[文档](https://docs.djangoproject.com/es /1.9/ref/contrib/admin/#django.contrib.admin.ModelAdmin.save_related) – beCurious

相关问题