a

Câu hỏi Giới hạn số phiên bản mẫu được tạo - django


Tôi có mô hình mà từ đó tôi chỉ muốn tạo một cá thể và không được phép thêm trường hợp nào nữa.

Điều này có thể không? Tôi có cảm giác rằng tôi đã nhìn thấy điều này được thực hiện ở đâu đó, nhưng tiếc là tôi không thể xác định được nó.

CHỈNH SỬA: Tôi cần điều này cho một CMS đơn giản ngu ngốc. Tôi có một lớp trừu tượng mà lớp FrontPage và Page thừa hưởng. Tôi chỉ muốn có thể tạo một đối tượng frontpage.

Sự khác biệt giữa đối tượng FrontPage và các đối tượng Page là chúng được cho là có các trường và mẫu hơi khác nhau, và như đã đề cập chỉ có một FrontPage được tạo ra.


22
2018-01-26 09:17


gốc


Điều gì sẽ xảy ra nếu ai đó cố gắng tạo ra một ví dụ thứ hai? - sth
Câu hỏi hay. Có lẽ cách đơn giản nhất là cung cấp một số loại thông báo lỗi khi một cố gắng lưu dụ thứ hai. - vorpyg
Bạn đang cố làm gì vậy? Hạn chế sự khởi tạo của một Mô hình nghe có vẻ mong manh. - tback
Tôi đang thử nghiệm với một giải pháp nguyên thủy cms. Tôi có một lớp trang trừu tượng và lớp FrontPage kế thừa điều này. Sau đó, tôi muốn chỉ cho phép một đối tượng trang chủ. - vorpyg
Nó có lẽ không mong muốn để tạo ra một đối tượng Frontpage độc ​​đáo. Bạn có thể đăng khái niệm đằng sau đối tượng frontpage không? - tback


Các câu trả lời:


Tôi muốn làm một cái gì đó tương tự bản thân mình, và thấy rằng xác nhận mô hình của Django cung cấp một móc thuận tiện để thực thi:

from django.db import models
from django.core.exceptions import ValidationError

def validate_only_one_instance(obj):
    model = obj.__class__
    if (model.objects.count() > 0 and
            obj.id != model.objects.get().id):
        raise ValidationError("Can only create 1 %s instance" % model.__name__)

class Example(models.Model):

    def clean(self):
        validate_only_one_instance(self)

Điều đó không chỉ ngăn cản việc tạo ra các trường hợp mới, nhưng giao diện người dùng quản trị Django sẽ thực sự báo cáo rằng việc tạo thất bại và lý do là "Chỉ có thể tạo 1 Ví dụ mẫu" (trong khi phương thức trả lại sớm trong tài liệu không đưa ra chỉ dẫn nào về việc tại sao lưu không hoạt động).


28
2018-06-22 06:50



Phiên bản đầu tiên của đề xuất này có một lỗ hổng cũng ngăn cản việc chỉnh sửa các thuộc tính sau khi cá thể được phép đã được tạo. Phiên bản hiện tại không có vấn đề đó. - ncoghlan
@jeverling đã chỉ ra trong bản chỉnh sửa được đề xuất rằng điều này có thể được mở rộng để xử lý một số lượng tùy ý các trường hợp bằng cách tinh chỉnh điều kiện và thông báo lỗi một cách thích hợp. Tuy nhiên, tốt nhất nên đăng bài đó dưới dạng câu trả lời bổ sung riêng biệt. - ncoghlan
Cách tiếp cận tốt đẹp, Cảm ơn. Nó hoạt động trong trường hợp của tôi - Ajay Kumar
Tốt hơn nên sử dụng pk không phải id: obj.pk != model.objects.get().pk - Romeno


Nếu bạn chỉ muốn ngăn người dùng sử dụng giao diện quản trị từ việc tạo các đối tượng mô hình bổ sung, bạn có thể sửa đổi phương thức "has_add_permission" của lớp ModelAdmin của mô hình:

# admin.py
from django.contrib import admin
from example.models import Example

class ExampleAdmin(admin.ModelAdmin):
  def has_add_permission(self, request):
    num_objects = self.model.objects.count()
    if num_objects >= 1:
      return False
    else:
      return True

admin.site.register(Example, ExampleAdmin)

Điều này sẽ loại bỏ nút "thêm" trong giao diện quản trị ngăn người dùng thậm chí cố gắng tạo nhiều hơn số được chỉ định (trong trường hợp này là 1). Tất nhiên bổ sung chương trình vẫn sẽ có thể.


23
2017-09-18 02:11





Bạn có thể làm một cái gì đó như thế này, từ tài liệu Django:

class ModelWithOnlyOneInstance(models.Model):
    ... fields ...

    def save(self, *args, **kwargs):
      if ModelWithOnlyOneInstance.objects.count() > 1:
        return

      super(ModelWithOnlyOneInstance, self).save(*args, **kwargs)

3
2018-01-26 09:33



Điều này không đảm bảo rằng nhiều nhất một trường hợp sẽ được tạo ra - trừ khi chỉ có một luồng / quy trình. - Tomasz Zielinski
Đó là sự thật - nếu bạn thực sự lo lắng về nó, tôi nghĩ bạn sẽ cần phải làm điều gì đó với post_save tín hiệu và bắt đầu phát với đồng bộ hóa chuỗi. - Dominic Rodger


@ncoghlan giải pháp của bạn đang hoạt động tốt nhưng không thân thiện với người dùng: người dùng có quyền truy cập vào biểu mẫu tạo và sẽ cho rằng anh ấy / cô ấy có thể sử dụng nó, mặc dù anh ấy / cô ấy sẽ không bao giờ có thể lưu nó.

Nó thực sự có thể kết hợp nó với giải pháp của Brendan, nó sẽ ẩn nút 'Thêm'. Sử dụng Mixins để tái sử dụng dễ dàng:

# models.py
from django.db import models
from django.core.exceptions import ValidationError

class SingleInstanceMixin(object):
    """Makes sure that no more than one instance of a given model is created."""

    def clean(self):
        model = self.__class__
        if (model.objects.count() > 0 and self.id != model.objects.get().id):
            raise ValidationError("Can only create 1 %s instance" % model.__name__)
        super(SingleInstanceMixin, self).clean()

class Example(SingleInstanceMixin, models.Model):
    pass


# admin.py
from django.contrib import admin
from example.models import Example

class SingleInstanceAdminMixin(object):
    """Hides the "Add" button when there is already an instance."""
    def has_add_permission(self, request):
        num_objects = self.model.objects.count()
        if num_objects >= 1:
            return False
        return super(SingleInstanceAdminMixin, self).has_add_permission(request)

class ExampleAdmin(SingleInstanceAdminMixin, admin.ModelAdmin):
     model = Example

2
2017-10-08 22:45





Tôi sẽ ghi đè phương thức create () trên trình quản lý mặc định, nhưng như đã nói ở trên, điều này sẽ không đảm bảo bất cứ điều gì trong môi trường đa luồng.


0
2018-01-26 11:42