2011-02-03 27 views
8

Tôi muốn tạo ra một sên ngẫu nhiên cho mô hình của tôi, nhưng không thiết lập "trống = True" (như tôi muốn thực thi nó sau này với xác nhận.)Django - Tạo sên mặc định

Tôi đã tự hỏi nếu tôi có thể làm một cái gì đó như thế này:

slug = models.SlugField(unique=True, default=some_method(), verbose_name='URL Slug') 

Trường hợp some_method là phương pháp tạo ngẫu nhiên sên? Tôi đã thử đoạn code trên và nó không hoạt động :(

Những gì tôi muốn làm là tạo ra một sên độc đáo (unique_slugify?)

+0

Điều này gọi phương thức khi đối tượng được tạo, dự định này? – jbcurtin

+0

Có, mặc dù nó không hoạt động ... NameError: tên 'some_method' không được xác định – Hanpan

Trả lời

8

Bạn có thể ghi đè lên các mô hình tiết kiệm-phương pháp để khi . một thực thể mới được tạo, bạn tạo ra sên khi đang bay một cái gì đó như:

if not self.pk: 
    self.slug = ''.join(random.sample(string.ascii_lowercase, 10)) 

bạn thể làm điều đó, nhưng nó không phải là rất tốt và tốt hơn là nên để cho sên là một slugified xác định phiên bản của tên đối tượng.

+0

Tôi không ngại nếu đó là trường hợp, tôi chỉ bối rối như thế nào tôi muốn đặt nó vào đó là mặc định . Tôi không sử dụng bảng điều khiển quản trị – Hanpan

+0

một chuỗi ngẫu nhiên không tốt cho tính độc đáo, tốt hơn để gắn bó với một cái gì đó như tiêu hóa của (dấu thời gian kết hợp với ngẫu nhiên) –

+0

Cảm ơn. Tôi không muốn ghi đè phương thức lưu nhưng có vẻ như không thể tránh khỏi. Tommaso, nếu bạn có một ví dụ về những gì bạn có nghĩa là tôi sẽ đánh giá cao nó. – Hanpan

1

có thể xác thực mô hình có thể giúp bạn không? http://docs.djangoproject.com/en/dev/ref/models/instances/

Bạn chỉ cần đơn giản xác nhận giá trị cần được viết trong trường sên và nếu đã tồn tại, hãy tạo thứ gì đó độc đáo.

Đồng thời ghi đè phương pháp lưu mô hình có thể là giải pháp.

Chúc mừng.

0

tìm kiếm trong google, tôi thấy câu hỏi tương tự: How to use slug in django

Tôi nghĩ vậy cách tiếp cận tốt hơn là viết lại phương pháp tiết kiệm, và validade lĩnh vực này ở dạng.

Nhưng, sên phải là duy nhất, do đó, tạo chuỗi ngẫu nhiên không tốt! Giống như Tommaso Bardugi nói sớm, nếu bạn thêm dấu thời gian vào url, điều này sẽ được giải quyết.

19

Bạn có thể sử dụng điều này khi bạn muốn sên của bạn được tạo tự động với mục nhập được thực hiện trong một số trường khác trong cùng một mô hình, nơi con ốc sên nằm.

from django_extensions.db.fields import AutoSlugField 

slug = AutoSlugField(_('slug'), max_length=50, unique=True, populate_from=('name',)) 
  • populate_from là lĩnh vực trong mô hình đó sẽ tự động tạo ra sên
+4

Đối với những người không biết, nó xuất hiện mô-đun django_extensions là từ thư viện cùng tên: http://packages.python.org/django-extensions/# – MrOodles

2

default có phải là một giá trị hoặc một callable.
Vì vậy, nó là default=some_method, không phải default=some_method(). Dưới đây là ví dụ:

from django.contrib.auth.models import UserManager 

def randomString(): 
    um = UserManager() 
    return(um.make_random_password(length=25)) 

class Foo(models.Model): 
    code = models.CharField(max_length=25, default=randomString) 
+0

Thú vị, sử dụng 'random.random' không công việc tôi nhận được một lỗi 'Không thể serialize function', nhưng chức năng tùy chỉnh này đã làm. – Flimm

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