6

したがって、データベースのクエリに使用される単一の入力フィールドを持つ超基本的なフォームを作成したいと考えています。

私のモデル ( models.py) は次のとおりです。

from django.db import models

class Book(models.Model):
    uid = models.IntegerField(primary_key=True)
    title = models.CharField(max_length=30)
    class Meta:
        db_table = u'books'

forms.py:

from django import forms
from myapp.models import Book

class EnterIDForm(forms.form):
book_id = forms.CharField()
# add a custom clean function to validate that the user input
#  is a valid book ID
def clean_book_id(self):
    try:
        book_id = int(self.cleaned_data["book_id"])
    except:
        book_id = None

    if book_id and Book.objects.filter(uid=book_id).count():
        return book_id
    else:
        raise forms.ValidationError("Please enter a valid book ID number.")

views.py:

from django.shortcuts import render_to_response
from myapp.models import Book

def form_view(request):
    if request.method == "POST":
        # the user has submitted the form, see if we have a book
        book_id_form = EnterIDForm(request.POST) # instantiate our form class with the user data
        if book_id_form.is_valid():
            # if our form is valid, then we have a book_id that works:
            the_book = Book.objects.get(uid=book_id_form.cleaned_data["book_id"])
                return render_to_response("book_template.html", { "the_book": the_book }, context_instance=RequestContext(request))
        # if the form wasn't valid, it will fall through to the other return statement.
    else:
        # If the user didn't submit a form, instantiate a blank one.
        book_id_form = EnterIDForm()
    return render_to_response("form_template.html", { "book_id_form": book_id_form }, context_instance=RequestContext(request))

入力フィールドでユーザーから「uid」を収集し、uid がデータベース内の本である Book モデル インスタンスからすべてのデータを表示する必要があります。

フォームがビューや後のテンプレートとどのように結び付けられているかは理解していますが、それを機能させることができないようです。

Django のサイトや他の多くのリソースで、学ぶことができる例を無限に検索しましたが、何も見つかりませんでした。

誰か手伝ってくれませんか?

ありがとう。

4

1 に答える 1

10

ここで簡単な検索を行うことができます。POST呼び出しやフォームの作成は必要ありません。ただし、フォームを作成する場合でも、正しい方向を示す必要があります。

次のようなものを試してください。

search.html:

<form method="get" action="/search/">
  Search Notecards:<input type="text" name="q" id="id_q" value="{{ query }}"/>
  <input type="submit" value="Search" />
</form>

views.py:

from myapp.models import Book
from django.template import RequestContext
from django.shortcuts import render_to_response

def search(request):
    query = request.GET.get('q')
    try:
        query = int(query)
    except ValueError:
        query = None
        results = None
    if query:
        results = Book.objects.get(uid=query)
    context = RequestContext(request)
    return render_to_response('results.html', {"results": results,}, context_instance=context)

results.html:

{% if results %}
  {% for result in results %}
    {{ result.uid }}
    {{ result.xxxx }}
    {{ result.xxxx }}
  {% endfor %}
{% else %}
    <h3 class='error'>Please enter a valid UID</h3>
    <form method="get" action="/search/">
      Search Notecards:<input type="text" name="q" id="id_q" value="{{ query }}"/>
      <input type="submit" value="Search" />
    </form>
{% endif %}
于 2013-01-09T04:27:02.840 に答える