2008-11-07 35 views
7

Cho một mô hình Django.db lớp:Làm cách nào để thêm giá trị mặc định (ẩn) để tạo mẫu trong Django?

class P(models.Model): 
    type = models.ForeignKey(Type) # Type is another models.Model class 
    name = models.CharField() 

nơi người ta muốn tạo ra một P mới với một loại nhất định, tức là làm thế nào để làm cho "loại" là một mặc định, lĩnh vực ẩn (từ người sử dụng) , trong đó type được đưa ra likeso:

http://x.y/P/new?type=3 

Vì vậy mà theo hình thức không "gõ" lĩnh vực sẽ xuất hiện, nhưng khi P được lưu, loại của nó sẽ có id 3 (tức là Type.objects.get (pk = 3)).

Thứ hai, cách một (& là có thể) chỉ định loại "mặc định" trong url, thông qua urls.py, khi sử dụng chế độ xem chung Django, viz.

urlpatterns = ('django.generic.views.create_update', 
    url(r'^/new$', 'create_object', { 'model': P }, name='new_P'), 
) 

Tôi thấy rằng rất khó mô tả, có thể là một phần của sự cố. :) Đầu vào được nhiều đánh giá cao!

Trả lời

5

Để có một mặc định khoá ngoại trong một mô hình:

mydefault = Type.objects.get(pk=3) 

class P(models.Model): 
    type = models.ForeignKey(Type, default=mydefault) # Type is another models.Model class 
    name = models.CharField() 

Lưu ý rằng việc sử dụng pk=x là khá xấu xí, như lý tưởng bạn không nên quan tâm những gì khóa chính bằng. Hãy thử để có được đối tượng mà bạn muốn bởi một số thuộc tính khác.

Here 'là cách bạn đặt giá trị mặc định trong các url của bạn:

# URLconf 
urlpatterns = patterns('', 
    (r'^blog/$', 'blog.views.page'), 
    (r'^blog/page(?P<num>\d+)/$', 'blog.views.page'), 
) 

# View (in blog/views.py) 
def page(request, num="1"): 
    # Output the appropriate page of blog entries, according to num. 

Trong ví dụ trên, cả hai mẫu URL trỏ đến quan điểm tương tự - blog.views.page - nhưng mô hình đầu tiên không chụp bất kỳ thứ gì từ URL. Nếu mẫu đầu tiên khớp với nhau, hàm page() sẽ sử dụng đối số mặc định của nó cho num, "1". Nếu mẫu thứ hai khớp nhau, trang() sẽ sử dụng bất kỳ giá trị num nào đã được regex thu thập.

8

Tiện ích django.forms.widgets.HiddenInput sẽ hiển thị trường của bạn là ẩn.

Trong hầu hết các trường hợp, tôi nghĩ bạn sẽ thấy rằng bất kỳ giá trị biểu mẫu ẩn nào cũng có thể được chỉ định làm tham số url thay thế. Nói cách khác:

<form action="new/{{your_hidden_value}}" method="post"> 
.... 
</form> 

và trong urls.py:

^/new/(?P<hidden_value>\w+)/ 

tôi thích kỹ thuật này bản thân mình vì tôi chỉ thực sự thấy mình cần biểu mẫu form ẩn khi tôi cần phải theo dõi các khóa chính của một mô hình ví dụ - trong trường hợp đó, url "chỉnh sửa/pkey" phục vụ mục đích của cả việc bắt đầu chỉnh sửa/trả lại biểu mẫu và nhận POST khi lưu.

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