Tôi vừa xem qua số ForeignKey.limit_choices_to trong tài liệu Django. Không chắc chắn cách thức hoạt động của nó, nhưng nó có thể chỉ là suy nghĩ đúng ở đây.
Cập nhật: ForeignKey.limit_choices_to cho phép chỉ định đối tượng liên tục, gọi hoặc đối tượng Q để hạn chế các lựa chọn cho phép cho khóa. Một hằng số rõ ràng là không sử dụng ở đây, vì nó không biết gì về các đối tượng liên quan.
Sử dụng hàm có thể gọi (hàm hoặc phương thức lớp hoặc bất kỳ đối tượng có thể gọi) nào có vẻ hứa hẹn hơn. Vấn đề vẫn là cách truy cập thông tin cần thiết từ đối tượng HttpRequest. Sử dụng thread local storage có thể là một giải pháp.
2. Cập nhật: Đây là những gì Ngài đã làm việc cho tôi:
Tôi tạo ra một middleware như mô tả trong liên kết ở trên. Nó trích xuất một hoặc nhiều đối số từ phần GET của yêu cầu, chẳng hạn như "product = 1" và lưu trữ thông tin này trong các địa phương chủ đề.
Tiếp theo có một phương thức lớp trong mô hình đọc biến cục bộ luồng và trả về danh sách các id để giới hạn lựa chọn trường khóa ngoài.
@classmethod
def _product_list(cls):
"""
return a list containing the one product_id contained in the request URL,
or a query containing all valid product_ids if not id present in URL
used to limit the choice of foreign key object to those related to the current product
"""
id = threadlocals.get_current_product()
if id is not None:
return [id]
else:
return Product.objects.all().values('pk').query
Điều quan trọng là trả về truy vấn chứa tất cả các id có thể nếu không có id nào được chọn sao cho các trang quản trị bình thường hoạt động tốt.
Các lĩnh vực trọng điểm nước ngoài sau đó được khai báo là:
product = models.ForeignKey(
Product,
limit_choices_to={
id__in=BaseModel._product_list,
},
)
Việc nắm bắt được rằng bạn cần phải cung cấp thông tin để hạn chế sự lựa chọn thông qua yêu cầu. Tôi không thấy một cách để truy cập "tự" ở đây.
bạn không nên sử dụng "null = True", tôi nghĩ. Tra cứu nó trong django doc – Ber
null = True đề cập đến CharFields. Ở đây, nó là hoàn toàn ok để có null = True (nếu không cha mẹ không thể được lưu mà không có con) –