2015-10-20 6 views
0

Я некоторое время застрял в этой функции. Ваша помощь очень ценится.django- Как фильтровать базу данных на основе представленных данных формы

Пользователь вводит информацию в форме и представляет ее. Затем, основываясь на записи пользователя, мы делаем фильтр в базе данных и показываем в шаблоне две таблицы: одна - форма ввода данных, другая - результат после фильтрации.

Возьмите краткий пример:

В форме есть «возраст», «название«информация. Пользователь заполняет его и отправляет форму. Затем в базе данных мы получаем оценку на основе «возраста» и «имени».

Таким образом, в общем, есть два HTML, как показано ниже:

enter image description here

Они находятся в том же приложении. Ниже приведены фрагменты. Мои основные вопросы перечислены в views.py.

models.py

class Input(models.Model): 
    name=models.CharField(max_length=100) 
    age=models.IntegerField(blank=False,null=False) 

class Result(models.Model): 
    score=models.IntegerField(blank=False,null=False) 
    subjects=models.CharField(max_length=100) 

forms.py

class InputForm(forms.ModelForm): 
...... 

views.py

class ResultView(): 
     context_object_name = 'result_list' 
     template_name = 'result_list.html' 

    def input(request): 
     if request.method == 'POST': 
      form = InputForm(request.POST) 
      if form.is_valid(): 
       name = form.cleaned_data['name'] 
       age = form.cleaned_data['age'] 

       # Here how can filter on the database based on form entry? 

       queryset=queryset.filter(name=name,age=age) 
       scor=Result.objects.filter(queryset) 
       subject=Result.objects.filter(queryset) 

       # how can I show the result in the redirected page? 
       return redirect('result') 

      else: 
       print form.errors 
     else: 
      form=InputForm()    
     return render_to_response('inputform.html',{'form': form},context_instance=RequestContext(request)) 

второе решение views.py

**views.py** 

     def input(request): 
      if request.method == 'POST': 
       form = InputForm(request.POST) 
       if form.is_valid(): 
        name = form.cleaned_data['name'] 
        age = form.cleaned_data['age'] 

        # how can I show the result in the redirected page? 
        return redirect('result') 

       else: 
        print form.errors 
      else: 
       form=InputForm()    
      return render_to_response('inputform.html',{'form': form},context_instance=RequestContext(request)) 


class ResultView(): 
    context_object_name = 'result_list' 
    template_name = 'result_list.html' 

    # Here how can I get the form entry (name/age) to filter?      
    queryset=queryset.filter(name=name,age=age) 
    scor=Result.objects.filter(queryset) 
    subject.Result.objects.filter(queryset) 

    def get_context_data(self, **kwargs): 
     context = super(ResultView, self).get_context_data(**kwargs) 
     context['input']=....? /*how can I show the entry information as well here? 

     return context 

URL

url(r'^result_list/$',ResultView.as_view(),name='result'), 
url(r'^input', 'result.views.input',name='input'), /*then here 2 url refers to the same views..I know it is not correct, so should I put input and result in 2 different views. def? Then how can filter based on the form input? 

фрагмент кода HTML для страницы результатов

<div class="informtaion">   
    <!--information from the entry page shown on the left part--> 
    {% for input_object in input %} 
     <table border="1" cellpadding="1"> 
     <tr> 
      <td align="left">name</td> 
      <td>{{input_object.name}}</td> 
     </tr> 
     <tr> 
      <td align="left">age</td> 
      <td>{{input_object.age}}</td> 
     </tr>  
     </table> 
    {% endfor %} 
    </div>   

    <div class=""> <!--result shown on the right part--> 
    {% for list in result_list %} 

     <table border="0" cellspacing="10" cellpadding="10">   
     <td bgcolor="#F0F0F0"> {{list.subject}}</td>  
     <td bgcolor="#F0F0F0"> {{list.scor}}</td> 
     .................  
    {% endfor %} 
    </table> 
    </div> 

ответ

1

На месте

return redirect('result') 

Использование

return render(request,self.template_name,{'score':scor}) 

И сделать в HTML.

<div class=""> <!--result shown on the right part--> 
<table border="0" cellspacing="10" cellpadding="10">   
{% for list in score %} 
    <td bgcolor="#F0F0F0"> {{list.subject}}</td> 
    <td bgcolor="#F0F0F0"> {{list.scor}}</td> 
    .................  
{% endfor %} 
</table> 
</div> 
+1

Ну, это до вас. Как работает ваш код, я не думаю, что он создаст какие-либо проблемы, используя только один вид. Вы можете выбрать только один вид. – kartikmaji

+0

в html, который вы положили, можно ли удалить {% for list in score%} напрямую? Просто показать {{input.subject}}, {{input.scor}} отдельно для каждого поля? (input - имя views.py def). Или использовать {% для списка в input%}, а не счет? –

+0

Проблема, если я ставлю в том же def, состоит в том, что этот 2 url перейдет на одну страницу, но на самом деле 2 разных URL-адреса должны перейти на другую страницу. –

Смежные вопросы