2012-01-25 28 views
14

Tôi đã quét qua tài liệu Django, và kết quả tìm kiếm của Google, tất cả các buổi chiều và tôi vẫn còn phần nào bị mắc kẹt trong nỗ lực của tôi để tạo ra một hình thức năng động. Tôi hy vọng tôi chỉ cần một ai đó để thúc đẩy tôi đi đúng hướng :-) Tôi chỉ mới bắt đầu học Django, vì vậy tôi vẫn còn rất nhiều người mới bắt đầu; tuy nhiên, tôi đã là người dùng python trung gian.Hình thức động Django - dân số trên thực tế?

Điều tôi đang cố gắng tạo ra một biểu mẫu động, trong đó người dùng thực hiện lựa chọn từ trình đơn thả xuống và dựa trên lựa chọn đó, một phần khác của biểu mẫu sẽ tự động cập nhật để hiển thị kết quả có liên quan đến hiện tại mục đã chọn, nhưng từ một bảng cơ sở dữ liệu khác.

tôi sẽ cố gắng và sử dụng một phiên bản đơn giản của các mô hình từ các hướng dẫn Django để minh họa rõ hơn những gì tôi đang cố gắng để làm:

# models.py 
from django.db import models 

class Poll(models.Model): 
    question = models.CharField(max_length=200) 

class Choice(models.Model): 
    poll = models.ForeignKey(Poll) 
    choice = models.CharField(max_length=200) 

Vì vậy, cho phép nói rằng tôi muốn có một cái gì đó giống như một drop- xuống trường lựa chọn, được điền với câu hỏi từ mỗi Thăm dò ý kiến ​​trong cơ sở dữ liệu. Tôi cũng muốn có một trường văn bản, hiển thị các lựa chọn tương ứng cho Cuộc thăm dò hiện đang được chọn, sẽ cập nhật trực tiếp bất cứ khi nào người dùng chọn một Hồ bơi khác. Tôi đã có thể tìm ra điều này bằng cách đặt một nút và đăng thông tin trở lại biểu mẫu; Tuy nhiên, tôi đang cố gắng làm điều này tự động khi người dùng thực hiện lựa chọn. Quan điểm của tôi loại trông giống như thế này vào lúc này:

#view.py 
from django import forms 
from django.shortcuts import render_to_response 

from myapp.models import Poll,Choice 

class MyModelChoiceField(forms.ModelChoiceField): 
    def label_from_instance(self, obj): 
     return "%s" % obj.question 

class PollSelectionForm(forms.Form): 
    polls = MyModelChoiceField(queryset=Poll.objects.all()) 

class ChoiceResults(forms.Form): 
    def __init__(self, newid, *args, **kwargs): 
     super(ChoiceResults, self).__init__(*args, **kwargs) 

     self.fields['choice'] = forms.TextField(initial="") 

def main(request): 
    return render_to_response("myapp/index.html", { 
     "object": PollSelectionForm(), 
     "object2": ChoiceResults(), 
    }) 

mẫu của tôi rất đơn giản, chỉ cần một cái gì đó giống như

{{ object }} 
{{ object2 }} 

tôi chắc chắn rằng con đường tôi đang đi về việc tạo ra các hình thức là Như tôi đã đề cập, tôi đã đọc các giải pháp liên quan đến việc đăng ký lại biểu mẫu, nhưng tôi muốn điều này xảy ra khi đang chạy ... nếu tôi có thể đăng lại một cách minh bạch thì tôi sẽ đoán thế. Tôi cũng đã thấy các thư viện sẽ cho phép bạn tạo các biểu mẫu động, nhưng điều đó có vẻ như quá mức cần thiết.

+1

Bạn cần ajax nếu bạn muốn điều đó xảy ra tự động mà không cần phải refresh lại trình duyệt - một cái nhìn cần phải lấy hình thức đầu vào và đáp ứng với nội dung rằng javascript có thể đọc và thay thế các phần tử html trong của bạn hình thức. –

Trả lời

5

Dưới đây là một cách tiếp cận - Django/jQuery Cascading Select Boxes?

Bạn có thể tạo một cái nhìn mới mà chỉ làm cho json thành một chuỗi, và sau đó kích hoạt một sự kiện khi bạn đã hoàn tất việc lựa chọn từ danh sách đầu tiên mà tải các dữ liệu động từ json đó.

+0

Tôi đã sử dụng phương pháp đầu tiên được mô tả trong liên kết. Nó giống như một chút hack, vì nó liên quan đến việc sửa đổi động các tham số ngữ cảnh của bạn dựa trên dữ liệu POST, và đăng lại biểu mẫu của bạn, nhưng dường như đó là cách nhanh nhất để đến nơi tôi cần. Bí quyết đối với tôi là tạo một hàm Javascript đơn giản gửi biểu mẫu của bạn và móc đến cuộc gọi "OnChange" bên trong hộp lựa chọn của tôi. Khi giải pháp mô tả, bạn chỉ cần tải lại mẫu đó với dữ liệu ngữ cảnh mới dựa trên thông tin bạn chuyển trong POST –

3

Tôi làm một điều tương tự ở đây, điền vào biểu mẫu dựa trên lựa chọn trong trình đơn thả xuống. Có lẽ điều này sẽ giúp bạn.

Dưới đây là mô hình của các giá trị sử dụng để điền trước các hình thức:

class OpmerkingenGebrek(models.Model): 
    opmerking = models.CharField(max_length=255) 
    advies = models.CharField(max_length=255) 
    urgentiecodering = models.CharField(max_length=2, choices=URGENTIE_CHOICES_2011) 
    bepaling = models.CharField(max_length=155,blank=True,null=True) 
    aard = models.CharField(max_length=3, choices=AARD_CHOICES) 

Quan điểm cho rằng quản lý theo hình thức:

def manage_component(request,project_id,.....): 
    # get values for pre-populate 
    og = OpmerkingenGebrek.objects.all() 
    ......... 
    formset = ComponentForm(request.POST,request.FILES) 
    ......... 
     ))) 
    return render_to_response(template, { 
     'formset':formset, 
     ........ 
     'og':og, 
     },context_instance=RequestContext(request)) 

Các html ám chỉ rằng hình thức

{% extends "base.html" %} 
{% block extra_js %} 
<script type="text/javascript" src="/media/js/limitText.js"></script> 
<script type="text/javascript" src="/media/js/getValueOpmerking.js"></script> 
{% endblock %} 
<form enctype="multipart/form-data" method="post" action=""> 
{{ formset.as_table }} 
</form> 

<p>Choose default values:</p> 
<select id="default" onChange="getValue(this)"> 
    {% for i in og %} 
    <option value="{{ i.opmerking }} | {{ i.advies }} | {{ i.urgentiecodering }} | 
    {{ i.aard }} | {{ i.bepaling }}">{{ i.opmerking }}</option> 
    {% endfor %} 
</select> 

javascript điền sẵn biểu mẫu:

chức năng getValue (sel)

{ 
    //get values 
    var opm = sel.options[sel.selectedIndex].value; 
    //split string to parts 
    var parts = opm.split("|"); 
    // autofill form 
    var opmerking = document.getElementById("id_opmerking"); 
    opmerking.value = parts[0]; 
    var aanbeveling = document.getElementById("id_aanbeveling"); 
    aanbeveling.value = parts[1]; 
    var opt = document.getElementById("id_urgentie"); 
    var urgentie = opt.selectedIndex; 
    for(var i=0;i<opt.length;i++){ 
     if(opt.options[i].value == parts[2].split(' ').join('')){ 
      opt.selectedIndex = i; 
     }}; 

    var opt = document.getElementById("id_aard"); 
    var aard = opt.selectedIndex; 
    for(var i=0;i<opt.length;i++){ 
     if(opt.options[i].value == parts[3].split(' ').join('')){ 
      opt.selectedIndex = i; 
      }}; 

    var bepaling = document.getElementById("id_bepaling"); 
    bepaling.value = parts[4]; 
    }; 
+0

Tôi đã kết thúc bằng cách sử dụng một giải pháp khác, nhưng thật hữu ích khi thấy bạn đang sử dụng javascript để sửa đổi các giá trị biểu mẫu khác –

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