2015-08-02 17 views
5

Tôi có yêu cầu tạo biểu mẫu khảo sát. Các loại người dùng khác nhau sẽ có các câu hỏi khác nhau để trả lời trong cuộc khảo sát.Làm thế nào để sử dụng các biểu mẫu django để tạo một ứng dụng khảo sát với các câu hỏi và câu trả lời?

models.py

from django.contrib.auth.models import Group, User 

from django.db import models 

ANSWER_CHOICES = (
    ('0', 'No'), 
    ('1', 'Yes') 
) 


class Survey(models.Model): 
    name = models.CharField(max_length=100) 
    group = models.ForeignKey(Group) 

    def __str__(self): 
     return self.name 


class Feature(models.Model): 
    name = models.CharField(max_length=150) 
    survey = models.ForeignKey(Survey) 

    def __str__(self): 
     return self.name 


class Rating(models.Model): 
    rating = models.IntegerField(choices=ANSWER_CHOICES) 
    feature = models.ForeignKey(Feature) 
    rating_for = models.ForeignKey(User, related_name='rated_user') 
    rating_by = models.ForeignKey(User, related_name='rated_by') 

    def __str__(self): 
     return str.format("%s - %s", self.feature, self.rating) 

Câu trả lời (Đánh giá) cho mỗi câu hỏi (tính năng) là một trong hai là có hay không có một đại diện của nút radio. Khi người dùng gửi biểu mẫu, nó sẽ lưu các câu trả lời trong bảng xếp hạng.

Cách django để đạt được điều này là gì?

Cảm ơn


forms.py

from django import forms 
from django.forms import modelformset_factory, TextInput 

from survey.models import Rating, Feature 


class FeatureForm(forms.ModelForm): 
    class Meta: 
     model = Feature 


class RatingForm(forms.ModelForm): 
    class Meta: 
    model = Rating 


FeatureFormSetBase = modelformset_factory(Feature, extra=0, 
             widgets={'name': TextInput(attrs={'readonly': True, })} 
            ) 


class FeatureFormSet(FeatureFormSetBase): 
    def add_fields(self, form, index): 
     super(FeatureFormSet, self).add_fields(form, index) 
     form.fields['is_checked'] = forms.BooleanField(required=False) 

survey.html

<form action="." method="post" accept-charset="utf-8"> 
     <ul class="list-group"> 
      {% for form in formset.forms %} 
       <li class="list-group-item"> 
        <div class="hidden"> {{ form.survey }}</div> 
        <span> {{ form.name }} </span> 
        <span> {{ form.id }} </span> 
        <span> {{ form.is_checked }} </span> 
       </li> 
      {% endfor %} 

     </ul> 
     <p> 
      {{ formset.management_form }} 
      {% csrf_token %} 
      <button type="submit" name="action" value="save" class="btn btn-success">SAVE</button> 
     </p> 
    </form> 

Đó là đoạn code tôi có và nó hoạt động bây giờ nhưng tôi không chắc chắn nếu nó tốt nhất cách để giải quyết vấn đề này? Tôi có rất nhiều mã trong views.py để phân tích dữ liệu bài đăng ... có cách nào khác để đạt được điều này không?

view.py

def questionnaire(request): 
q = Feature.objects.filter(survey__group=request.user.groups.all()[0]).select_related('survey') 
if request.method == 'POST': 
    action = request.POST.get('action') 
    formset = FeatureFormSet(request.POST, queryset=q) 

    if formset.is_valid(): 
     # iterate over all forms in the formset 
     for form in formset.forms: 
      if action == u'save': 
       answer = form.cleaned_data.get('is_checked') 
       print("Saving answer...") 
       rating = Rating() 
       rating.rating = answer 
       rating.feature = form.cleaned_data.get('id') 
       rating.rating_for = request.user 
       rating.rating_by = request.user 
       rating.save() 

     redirect('useraccount_dashboard') 

else: 
    formset = FeatureFormSet(queryset=q) 

return render_to_response('account_survey.html', {'formset': formset}, context_instance=RequestContext(request)) 

CẬP NHẬT views.py

def questionnaire(request, instance_id): 
try: 
    instance = SurveyInstance.objects.get(pk=instance_id, completed=False) 
except SurveyInstance.DoesNotExist: 
    raise Http404 

if instance.rating_by != request.user: 
    return HttpResponse('Unauthorized', status=401) 

q = Feature.objects.filter(survey=instance.survey) 
if request.method == 'POST': 
    action = request.POST.get('action') 
    formset = FeatureFormSet(request.POST, queryset=q) 

    if formset.is_valid(): 
     # iterate over all forms in the formset 
     for form in formset.forms: 
      if action == u'save': 
       answer = form.cleaned_data.get('is_checked') 
       print("Saving answer...") 
       rating = Rating() 
       rating.rating = answer 
       rating.feature = form.cleaned_data.get('id') 
       rating.survey_instance = instance 
       rating.save() 

     instance.completed = True 
     instance.save() 
     messages.add_message(request, messages.INFO, 'Thank you for your feedback.') 
     return redirect('useraccount_dashboard') 

else: 
    formset = FeatureFormSet(queryset=q) 

return render_to_response('account_survey.html', {'formset': formset}, context_instance=RequestContext(request)) 
+0

Mã của bạn có vẻ ổn. Những gì bạn có nghĩa là * "django cách đạt được điều này" *, mặc dù? – xyres

+1

Đối với người mới bắt đầu, bạn không đăng bất kỳ mã nào về 'views.py' gây ra mối quan tâm của bạn và thứ hai - nếu bạn đang tìm kiếm các mẹo tối ưu hóa; thì tốt hơn nên đăng nó lên trên [codereview.stackexchange.com] (http://codereview.stackexchange.com) –

Trả lời

1

Hãy thử sử dụng form.save() thay vì tạo đối tượng Rating, điền vào đó là các lĩnh vực và sau đó lưu.

+0

Với sự sửa đổi nhỏ, tôi đã nhận nó để làm những gì tôi muốn. –

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