2012-08-12 27 views
13

Tôi đang đấu tranh để có được hình thức đầu django tròn của tôi .. Tôi đã đọc tài liệu khác nhau nhưng chỉ có thể không hoàn toàn nắm bắt các khái niệm. Tôi phải nắm bắt các mô hình, lượt xem và mẫu. Những gì tôi đang cố gắng làm là tạo một biểu mẫu với các trường khác nhau bao gồm các danh sách thả xuống và các hộp kiểm được điền bởi các giá trị trong cơ sở dữ liệu.tạo các hình thức django

Tôi có một ứng dụng đang hoạt động gọi là vms. Sử dụng models.py tôi đã xây dựng một lược đồ đơn giản chứa kích thước và kiểu. Kích thước bao gồm 'nhỏ', 'trung bình' & 'lớn'. Nhập là 'cửa sổ' & 'linux'. Sử dụng trang quản trị, tôi có thể thêm kích thước bổ sung, ví dụ: 'Cực lớn'.

Điều tôi muốn làm là tạo biểu mẫu có danh sách thả xuống của kích thước vm. Nếu kích thước thêm được thêm vào thông qua trang quản trị, tôi muốn kích thước đó xuất hiện trong danh sách thả xuống.

Tôi sẽ gửi nỗ lực của mình vào mã, nhưng thực sự đang phải vật lộn với các khái niệm. Bất cứ ai có thể giúp hướng dẫn tôi trong cách thực hiện ở trên?

Cảm ơn Oli

+2

đọc hướng dẫn https://docs.djangoproject.com/en/dev/intro/tutorial04/?from=olddocs/ và https://docs.djangoproject.com/en/dev/topics/forms/?from = olddocs. –

+0

Tôi đã nhìn thấy cả hai bài báo này và tôi sẽ đọc lại lần nữa .. Tôi đã hy vọng hiểu được mối quan hệ giữa biểu mẫu, lượt xem và mẫu và cách tạo danh sách thả xuống .. Tôi cho rằng có thể nó sẽ đưa tôi thời gian để tiêu hóa .. nếu bất cứ ai khác có thể dành thời gian giải thích điều này, tôi sẽ rất hạnh phúc! – Oli

Trả lời

30

Biểu mẫu chỉ là một công cụ để đơn giản hóa và tăng tốc (phát triển) quy trình tìm nạp dữ liệu POST từ yêu cầu. Một cách thủ công sẽ là làm request.POST.get('somefield') cho tất cả các trường có trong một số biểu mẫu HTML. Nhưng Django có thể làm tốt hơn thế ...

Về bản chất của nó, một lớp Mẫu nắm giữ một số lĩnh vực và thực hiện các nhiệm vụ: đầu vào HTML

  1. hiển thị,
  2. thu thập và xác nhận dữ liệu khi sử dụng gửi nó,
  3. nếu các trường không xác thực, trả lại giá trị cùng với thông báo lỗi cho HTML,
  4. nếu tất cả các trường xác thực, cung cấp từ điển thuận tiện để truy cập các giá trị này trong chế độ xem.

Với các giá trị này, sau đó tôi có thể tạo thủ công một phiên bản mới MyModel và lưu nó. Tất nhiên, tôi sẽ phải xác định một trường trong biểu mẫu cho mọi trường trong mô hình MyModel.

Điều này có nghĩa rằng, về cơ bản, tôi thể làm điều gì đó như thế này:
(tha thứ cho tôi vì đã không kiểm tra mã này, vì vậy tôi không thể xác rằng đó là chính xác 100%)

models.py: 

    class MyModel(models.Model): 
     field1 = models.CharField(max_length=40, blank=False, null=False) 
     field2 = models.CharField(max_length=60, blank=True, null=True) 

forms.py: 

    class FormForMyModel(forms.Form): 
     form_field1 = forms.CharField(max_length=40, required=True) 
     form_field2 = forms.CharField(max_length=60, required=False) 

views.py: 

    def create_a_my_model(request): 
     if request.method == 'POST': 
      form = FormForMyModel(request.POST) 
      if form.is_valid(): 
       my_model = MyModel() 
       my_model.field1 = form.cleaned_data.get('form_field1', 'default1') 
       my_model.field2 = form.cleaned_data.get('form_field2', 'default2') 
       my_model.save() 
     else:   
      form = FormForMyModel() 
     context_data = {'form': form} 
     return HttpResponse('templtate.html', context_data) 

(điều này có thể được viết với một vài dòng mã ít hơn, nhưng điều đó có nghĩa là càng rõ ràng càng tốt)

Lưu ý rằng không có mối quan hệ nào giữa các trường Mô hình và trường Mẫu! Chúng ta phải gán giá trị bằng tay cho cá thể MyModel khi tạo nó.

Ví dụ trên phác thảo luồng công việc biểu mẫu chung. Nó thường là cần thiết trong các tình huống phức tạp, nhưng không phải trong một tình huống đơn giản như ví dụ này.

Ví dụ này (và rất nhiều ví dụ thực tế), Django có thể làm tốt hơn thế ...

Bạn có thể nhận thấy hai vấn đề gây phiền nhiễu trong ví dụ trên:

  1. Tôi có để xác định các trường trên MyModel và các trường trên FormForMyModel riêng biệt. Tuy nhiên, có rất nhiều điểm giống nhau giữa hai nhóm (loại) của trường, vì vậy đó là loại công việc trùng lặp. Sự tương tự tăng lên khi thêm nhãn, trình xác thực, v.v.
  2. tạo MyModel thể hiện hơi ngớ ngẩn, phải gán tất cả các giá trị đó theo cách thủ công.

Đây là nơi mà một ModelForm do thỏa thuận.

Những hành động về cơ bản giống như một hình thức thường xuyên (trên thực tế, họ được mở rộng từ hình thức bình thường), nhưng họ có thể tiết kiệm cho tôi một số công việc (cả hai vấn đề tôi vạch ra, tất nhiên :)).

Vì vậy, trở lại hai vấn đề:

  1. Thay vì xác định một hình thức Dòng cho mỗi mô hình Field, tôi chỉ cần xác định model = MyModel trong lớp Meta. Điều này hướng dẫn Biểu mẫu tự động tạo biểu mẫu Các trường từ các trường mô hình.

  2. Mẫu biểu mẫu có phương thức save. Điều này có thể được sử dụng để tạo cá thể mô hình trong một dòng trong chế độ xem, thay vì gán trường theo trường theo cách thủ công.

Vì vậy, cho phép thực hiện ví dụ trên với một ModelForm:

models.py: 

    class MyModel(models.Model): 
     field1 = models.CharField(max_length=40, blank=False, null=False) 
     field2 = models.CharField(max_length=60, blank=True, null=True) 

forms.py: 

    class MyModelForm(forms.ModelForm): # extending ModelForm, not Form as before 
     class Meta: 
      model = MyModel 

views.py: 

    def create_a_my_model(request): 
     if request.method == 'POST': 
      form = MyModelForm(request.POST) 
      if form.is_valid(): 
       # save the model to database, directly from the form: 
       my_model = form.save() # reference to my_model is often not needed at all, a simple form.save() is ok 
       # alternatively: 
       # my_model = form.save(commit=False) # create model, but don't save to database 
       # my.model.something = whatever # if I need to do something before saving it 
       # my.model.save() 
     else:   
      form = MyModelForm() 
     context_data = {'form': form} 
     return HttpResponse('templtate.html', context_data) 

Hy vọng điều này đã xóa bỏ việc sử dụng Django tạo thành một chút.

Chỉ cần thêm một lưu ý - hoàn toàn ổn định để xác định trường Trường trên ModelForm. Chúng sẽ không được sử dụng trong form.save() nhưng vẫn có thể truy cập với form.cleaned_data giống như trong Biểu mẫu thông thường.

+0

Xin cảm ơn vì bài đăng của bạn. Tôi sẽ cung cấp cho nó một đi ngay bây giờ và tôi sẽ trở lại với bạn với tiến bộ - trong thực tế, tôi nhận thấy rằng bài viết của bạn là tương tự như một số tài liệu tôi đã đọc, nhưng bạn đã bao gồm một số ví dụ rõ ràng .. Điều này chắc chắn sẽ giúp đưa tất cả lại với nhau .. Hy vọng sẽ đến đó sớm .. – Oli

+1

Hey - có hình thức của tôi làm việc ngay bây giờ .. Trong trở ngại đầu tiên - nhờ sự giúp đỡ của bạn. Cùng với các ví dụ đưa ra trong câu hỏi này, docs.djangoproject.com/en/dev/intro/tutorial04/?from=olddocs và docs.djangoproject.com/en/dev/topics/forms/?from=olddocs và trang web này, peachybits.com/2011/09/django-1-3-form-api-modelform-example Tôi đã có thể làm việc đó. – Oli

2

Bạn đã cố gắng làm việc với ModelForms trước? Theo tôi hiểu, bạn đang tìm cách tạo một biểu mẫu dựa trên mô hình bạn đã tạo đúng không?

Cho phép nói mô hình của bạn được gọi là Nhiệt độ. Bạn có thể tạo ra một hình thức mà tương quan với mô hình này (và câu hỏi của bạn) như thế này:

forms.py

from django.forms import ModelForm 

class TempForm(ModelForm): 
    class Meta: 
    model = Temp 

Các ModelForm sẽ tự động lập bản đồ các lựa chọn/lựa chọn từ mô hình của bạn lên một phiên bản mẫu.

Nếu bạn có kế hoạch sử dụng điều này trong một mẫu sau, làm một cái gì đó như thế này sẽ tự động tạo một menu thả xuống với lựa chọn:

<form> 
    <label for="id_size">Size</label> 
    {{ form.size }} 
</form> 

Hy vọng rằng sẽ trả lời câu hỏi của bạn!

+1

Cảm ơn câu trả lời của bạn .. Tôi sẽ cố gắng và cung cấp cho điều này một đi. Tôi thực sự đi qua trang web này, http://www.peachybits.com/2011/09/django-1-3-form-api-modelform-example/, mặc dù nó là django 1.3 Tôi có thể thấy các khái niệm được sử dụng. Tôi sẽ quay lại với bạn khi tôi đã hiểu ví dụ của bạn. Chỉ cần vượt qua rào cản ban đầu có vẻ khó khăn, nhưng một khi tôi đã có nó, tôi chắc chắn nó sẽ chảy một cách dễ dàng. – Oli

+0

Hey - có các biểu mẫu của tôi đang hoạt động ngay bây giờ .. Qua rào cản đầu tiên - cảm ơn sự giúp đỡ của bạn. Cùng với các ví dụ đưa ra trong câu hỏi này, docs.djangoproject.com/en/dev/intro/tutorial04/?from=olddocs và docs.djangoproject.com/en/dev/topics/forms/?from=olddocs và trang web này, peachybits.com/2011/09/django-1-3-form-api-modelform-example Tôi đã có thể làm việc đó. – Oli

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