Я некоторое время застрял в этой функции. Ваша помощь очень ценится.django- Как фильтровать базу данных на основе представленных данных формы
Пользователь вводит информацию в форме и представляет ее. Затем, основываясь на записи пользователя, мы делаем фильтр в базе данных и показываем в шаблоне две таблицы: одна - форма ввода данных, другая - результат после фильтрации.
Возьмите краткий пример:
В форме есть «возраст», «название«информация. Пользователь заполняет его и отправляет форму. Затем в базе данных мы получаем оценку на основе «возраста» и «имени».
Таким образом, в общем, есть два HTML, как показано ниже:
Они находятся в том же приложении. Ниже приведены фрагменты. Мои основные вопросы перечислены в 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>
Ну, это до вас. Как работает ваш код, я не думаю, что он создаст какие-либо проблемы, используя только один вид. Вы можете выбрать только один вид. – kartikmaji
в html, который вы положили, можно ли удалить {% for list in score%} напрямую? Просто показать {{input.subject}}, {{input.scor}} отдельно для каждого поля? (input - имя views.py def). Или использовать {% для списка в input%}, а не счет? –
Проблема, если я ставлю в том же def, состоит в том, что этот 2 url перейдет на одну страницу, но на самом деле 2 разных URL-адреса должны перейти на другую страницу. –