2012-06-26 33 views
7

Tôi đang cố đặt giá trị mặc định trường dựa trên lựa chọn trường khác là ngoại tuyến. Về cơ bản, đây là những lớp học:Giá trị trường đặt Django tự động dựa trên các trường khác

class Product(models.Model): 
     description = models.CharField('Description', max_length=200) 
     price = models.FloatField('Price') 

class Sell(models.Model): 
     product = models.ForeignKey(Product) 
     price = models.FloatField('Price') 

Mỗi "sản phẩm" có giá mặc định (hoặc giá đề xuất), vì vậy khi sử dụng, trong trang quản trị, muốn thêm một Bán mới và anh/cô ấy chọn một sản phẩm, tôi cần phải sao chép động từ Product.price sang Sell.price giá được đề xuất. Tôi không thể sử dụng phương pháp "lưu" vì người dùng có thể thay đổi tại thời điểm đó.

Có cần sử dụng JavaScript một cách rõ ràng không? hoặc là có một cách thanh lịch ở Django để làm điều đó?

Trả lời

3

Bạn có thể giải quyết vấn đề này bằng móc trước khi lưu hoặc bằng cách ghi đè phương thức save() của mô hình Bán.

from django.db import models 

class Product(models.Model): 
    description = models.CharField('Description', max_length=200) 
    price = models.FloatField('Price') 

class Sell(models.Model): 
    product = models.ForeignKey(Product) 
    price = models.FloatField('Price') 

    # One way to do it: 
    from django.db.models.signals import post_save 
    def default_subject(sender, instance, using): 
     instance.price = instance.product.price 
    pre_save.connect(default_subject, sender=Sell) 

    # Another way to do it: 
    def save(self, *args, **kwargs): 
     self.price = self.product.price 
     super(Sell, self).save(*args, **kwargs) 
+1

Và một cách khác là khởi tạo trường 'price' trong phương thức' clean() 'của mô hình. Giống như ghi đè 'save()' nhưng là sạch hơn do không cần phải gọi 'super()' và nó là một móc khung được thiết kế chỉ dành cho điều này :) –

1

Bạn đang hỏi về việc cập nhật động các giá trị trường biểu mẫu trong trang web Quản trị? Hành vi biểu mẫu phía máy khách cần phải xảy ra trong JavaScript. Quản trị của Django cung cấp một số kịch bản đặc biệt để thêm/loại bỏ Inline, nhưng nó không cung cấp chức năng ở cấp độ này.

Quản trị viên của Django cung cấp jQuery trong ngữ cảnh trang dưới window.django.jQuery (hoặc chỉ django.jQuery). Các biểu mẫu Django luôn tạo ra các ID trường biểu mẫu ổn định. Kiểm tra mã biểu mẫu đầu ra và tìm bộ chọn Sản phẩm và trường nhập Sell.price tương ứng. Sau đó, bạn có thể sử dụng jQuery để thực hiện điều gì đó như thêm một trình xử lý .change() hoặc .on('change', ...) vào bộ chọn Sản phẩm với chức năng cập nhật giá trên trường Bán.

Để tham khảo trong tương lai, Django quản lý gần như đáp ứng yêu cầu của bạn với ModelAdmin.prepopulated_fields nhưng

prepopulated_fields không chấp nhận các lĩnh vực DateTimeField, ForeignKey, cũng không ManyToManyField.

Các vấn đề liên quan