2016-01-25 34 views
0

后,我有这样的模式:Django管理 - 填充等领域不断变化的外键

class Order(models.Model): 
    client = models.ForeignKey(
     Client, 
     on_delete=models.CASCADE, 
     related_name='orders', 
     related_query_name='order', 
    ) 

    delivery_country = CountryField('Kraj wysyłki', null=True, blank=True) 
    delivery_city = models.CharField('Miasto wysyłki', max_length=255, null=True, blank=True) 
    delivery_street = models.CharField('Ulica wysyłki', max_length=255, null=True, blank=True) 

    billing_country = CountryField('Kraj dla faktury', null=True, blank=True) 
    billing_city = models.CharField('Miasto dla faktury', max_length=255, null=True, blank=True) 
    billing_street = models.CharField('Ulica dla faktury', max_length=255, null=True, blank=True) 

    products = models.ManyToManyField(Product, through='OrderProduct') 

class Client(models.Model): 
    name = models.CharField('Imię', max_length=255) 
    surname = models.CharField('Nazwisko', max_length=255) 
    country = CountryField('Kraj', null=True, blank=True) 
    city = models.CharField('Miasto', max_length=255, null=True, blank=True) 
    street = models.CharField('Ulica', max_length=255, null=True, blank=True) 

而且我想实现这种行为在Django管理: 的Order.client的每一个变化之后,我想预填充其他领域像这样:

  • Order.delivery_country = client.country
  • Order.delivery_city = client.city
  • Order.delivery_street = client.street
  • Order.billing_country = client.country
  • Order.billing_city = client.city
  • Order.billing_street = client.street

是否有任何包/插件来实现这一目标? 或者,你可能有一些想法,我怎么能做到这一点?

+0

如果订单的细节是客户的字面上的细节,为什么你会储存数据的顺序呢?直接从'client'外键中取出它。 – Monkpit

+0

此外,我不同意您使帐单信息与运输信息相同,但这是一个完全独立的问题。如果我为我的朋友或亲戚购买礼物,而且我想将订单发送到与我的结算信息不同的位置?如果我为我的业务购买材料,但结算地点在总部,那么这些零件应该运送到另一个工厂? – Monkpit

+0

不幸的是我需要这两个地址。我不能将它们从外键拿走,因为客户的地址可能会在将来发生变化,我想要保持实际的分发地址。我需要两个地址,因为有时公司有一个地址要发票,他们的仓库在不同的地方。 – Blejwi

回答

0

好,我实现了这个:

JS:

(function ($) { 
    $(document).ready(function(){ 
     $("select[name='client']").on("change", function(){ 
      $.ajax({ 
       url: "/admin/clients/"+$(this).val(), 
       type: "GET", 
      }).done(function(data){ 
       client_data = $.parseJSON(data); 
       client_data = client_data[0]; 

       $("select[name='delivery_country']").val(client_data.fields.country); 
       $("input[name='delivery_city']").val(client_data.fields.city); 
       $("input[name='delivery_street']").val(client_data.fields.street); 

       $("select[name='billing_country']").val(client_data.fields.country); 
       $("input[name='billing_city']").val(client_data.fields.city); 
       $("input[name='billing_street']").val(client_data.fields.street); 
      }); 
     }); 
    }); 
})(django.jQuery); 

并查看:

def get_client_ajax(request, id): 
    return JsonResponse(serializers.serialize('json', Client.objects.filter(id=id)), safe=False)