2012-11-01 97 views
1

所以我構建了一個基本的Q &一個網站 - 每個主題都有一系列與其相關的問題,每個問題都有多個相關的答案。爲Django模型自動填充外鍵

我正在創建用戶輸入的問題,他們必須與一個主題相關聯。這是模型

#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') 

這就是URL的conf

#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中以確定哪​​個電影與該問題相關聯。但是,當我使用我的代碼時,它會將所有問題的電影關聯更改爲當前電影,而不僅僅是更改特定問題的電影關聯。如果沒有代碼,它根本不會將電影與問題關聯起來。我該如何解決?

回答

2

使用此:

#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。考慮一個場景,您決定將home URL從/home/更改爲/myhome/。您將不得不在任何地方使用它們進行編輯。它始終是更好地命名的網址(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')) 

現在什麼都只要name參數在URL配置中具有相同的值,就可以對URL進行更改(例如/ home/to/myhome /對視圖不起作用)。

如果你想傳遞參數(如movie_id你的情況)

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

同樣的概念應該在模板中使用,以避免在模板中硬編碼的網址。請閱讀this瞭解更多詳情

+0

真棒。完美地工作。非常感謝!還有一個 - 我如何將用戶重定向回前一個URL?我可以向HttpResponseRedirect(「home /(?P \ d +)/」)中添加一個變量,或者有更好的方法嗎? –

+1

您應該避免在視圖中使用絕對URL。我正在編輯答案以顯示應該如何完成根據我 – Konstant

+0

非常感謝,感謝幫助。 –