1

そこで、基本的なQ&Aサイトを構築しています。各トピックには一連の質問が関連付けられており、各質問には複数の回答が関連付けられています。

質問のユーザー入力を作成していますが、トピックに関連付ける必要があります。これは質問モデルです

#models.py
class Question(models.Model):
    movie           = models.ForeignKey(Movie, blank=True, null=True)
    question_text   = models.CharField(max_length = 1000)
    question_detail = models.CharField(max_length = 5000, blank = True, null = True)
    q_pub_date      = models.DateTimeField(auto_now_add = True)
    q_author        = models.ForeignKey(User)
class QuestionForm(ModelForm):
    def save(self, user = None, force_insert = False, force_update = False, commit = True):
        q = super(QuestionForm, self).save(commit = False)
        q.q_author = user
        if commit:
            q.save()
        return q

    class Meta:
        model = Question
        exclude = ('movie', 'q_author', 'q_pub_date')

これはURLconfです

#urls.py
url(r'^(?P<movie_id>\d+)/add_question/$', 'add_question'),

これがビューです

#views.py
def add_question(request, movie_id):
    if request.method == "POST":
        form = QuestionForm(request.POST, request.FILES)
        #QuestionForm.movie = Movie.objects.get(pk = movie_id)
        if form.is_valid():
            form.save(user = request.user)
            return HttpResponseRedirect("/home/")
    else:
        form = QuestionForm()
    return render_to_response("qanda/add_question.html", {'form': form}, context_instance = RequestContext(request))

これはHTMLコードです

#add_question.html
<h1> Add Question: {{ user.username }}</h1>
    <form action = "" method = "post">{% csrf_token %}
        {{ form.as_p }}
        <input type = "submit" value = "Ask" />
        <input type = "hidden" name = "next" value = "{{ next|escape }}" />
    </form>

ビューでは、コメント化された行は、モデルを自動保存するためにビューに追加したものです。質問を追加するとき、URLには関連付けられている映画のIDが含まれています。私の考えでは、そのIDを取得し、ForeignKeyに接続して、質問に関連付けられている映画を識別します。ただし、コードを使用すると、特定の質問の映画の関連付けを変更するだけでなく、すべての質問の映画の関連付けが現在の映画に変更されます。コードがないと、映画と質問はまったく関連付けられません。これを修正するにはどうすればよいですか?

4

1 に答える 1

3

これを使って:

#views.py
def add_question(request, movie_id):
    if request.method == "POST":
        form = QuestionForm(request.POST, request.FILES)
        if form.is_valid():
            question = form.save(user = request.user)
            question.movie = Movie.objects.get(pk = movie_id)
            question.save()
            return HttpResponseRedirect("/home/")
    else:
        form = QuestionForm()
    return render_to_response("qanda/add_question.html", {'form': form}, context_instance = RequestContext(request)

コメントで寄せられた質問について

ビューまたはテンプレートで絶対 URL を使用することは避けてください。homeURL を からに変更することにしたシナリオを考えてみましょ/home//myhome/。使用した場所はどこでも編集する必要があります。URL に名前を付ける ( docs ) ことを常にお勧めします。

# URL Conf
url(r'^home/$', 'home_view', name="home_url"),
url(r'^(?P<movie_id>\d+)/add_question/$', 'add_question', name="add_question_url"),
url(r'^home/(?P<movie_id>\d+)/$', 'movie_view', name="movie_url"),

引数はname、実際の URL に対する一意の識別子として機能します

今あなたのビューで:

from django.core.urlresolvers import reverse

def some_view(request):
    ...
    return HttpResponseRedirect(reverse('home_url'))

URL に変更を加えても (/home/ を /myhome/ に変更してもname、URL conf.

パラメータを渡したい場合(あなたの場合はmovie_idなど)

def some_view(request, movie_id):
    ...
    return HttpResponseRedirect(reverse('movie_url', kwargs={'movie_id':movie_id}))

テンプレートでの URL のハードコーディングを避けるために、同じ概念をテンプレートで使用する必要があります。詳しくはこちらをお読みください

于 2012-11-01T06:58:41.933 に答える