2015-05-01 172 views
1

我試圖爲沒有流行模塊的自己創建一個簡單的模型。然後堆疊在下面的東西上。將一個模型連接到另一個模型

我有兩個模型 - 文章(這裏的產品種類)和用戶自定義配置文件模型。所以我需要的是,當用戶轉到文章頁面時,他可以按下按鈕(也許是「購買」),並且該文章模型連接到用戶。所以他可以在他的個人資料頁面上看到它。此外,我需要在模板中的檢查功能,表明用戶買了文章或沒有(某種「if-else」)。

我已經通過ForeignKey將我的Article模型連接到我的用戶配置文件模型,但是現在我不知道下一個移動點的位置。有人可以幫忙嗎?

我的模型userprofile

import PIL 

    from django.db import models 
    from django.contrib.auth.models import User 
    from PIL import Image 
    from django.db import models 
    from article.models import Article 

    class UserProfile(models.Model): 
     user = models.OneToOneField(User) 
     user_picture = models.ImageField(upload_to='users', blank=False, null=False, default='users/big-avatar.jpg') 
     user_balance = models.IntegerField(default=0) 
     user_articles = models.ForeignKey(Article, blank=True, null=True) 

    User.profile = property(lambda u: UserProfile.objects.get_or_create(user=u) [0]) 

forms.pyuserprofile

from django import forms 
from userprofile.models import User 
from userprofile.models import UserProfile 

class UserForm(forms.ModelForm): 
    class Meta: 
     model = User 
     fields = ('email', 'first_name', 'last_name',) 

class UserProfileForm(forms.ModelForm): 
    class Meta: 
     model = UserProfile 
     fields = ('user_picture', 'user_balance') 

我對userprofile

from django.shortcuts import render, render_to_response, redirect 
from django.shortcuts import HttpResponseRedirect, Http404, HttpResponse 
from django.template import RequestContext 
from django.contrib.auth.decorators import login_required 
from django.core.context_processors import csrf 

from userprofile.forms import User 
from userprofile.forms import UserForm 
from userprofile.forms import UserProfileForm 

def userprofile(request, username): 
    u = User.objects.get(username=username) 
    if request.POST: 
     user_form = UserForm(request.POST, instance=request.user) 
     user_profile = UserProfileForm(request.POST, request.FILES, instance=request.user.profile) 
     if user_form.is_valid() and user_profile.is_valid(): 
      user_form.save() 
      user_profile.save() 
    else: 
     user_form = UserForm(instance=request.user, 
      initial={ 
       'first_name': request.user.first_name, 
       'last_name': request.user.last_name, 
       'email': request.user.email, 
      }) 
     user = request.user 
     profile = user.profile 
     user_profile = UserProfileForm(instance=profile) 

    return render_to_response('profile.html', {'user_form': user_form, 'user_profile': user_profile}, context_instance=RequestContext(request)) 

而且我的模型article,需要掛接觀點:

import PIL 

from django.db import models 
from django.contrib.auth.models import User 
from PIL import Image 
from django.db import models 

class Article(models.Model): 
    class Meta(): 
     db_table = 'article' 

    article_title = models.CharField(max_length=200, blank=False, null=False) 
    article_anchor = models.CharField(max_length=200, blank=False, null=False) 
    article_image = models.ImageField(upload_to='items', blank=False, null=False) 
    article_users = models.IntegerField(default=0) 

class Comments(models.Model): 
    class Meta(): 
     db_table = 'comments' 

    comments_date = models.DateTimeField() 
    comments_text = models.TextField(verbose_name=u'') 
    comments_article = models.ForeignKey(Article) 
    comments_from = models.ForeignKey(User) 
+0

你ForeignKey的是南轅北轍:它需要生活在文章並指向用戶配置。否則,用戶只能有一篇文章(但文章會有很多用戶),這顯然是錯誤的。 –

+0

Thx,丹尼爾。模型之間的關係 - 有時候對我有點困惑) –

回答

2

只是爲了澄清一些事情:

  1. 我假定用戶可以購買多篇文章
  2. 文章可以屬於多個用戶

如果是這種情況,那麼您在用戶模型和文章模型之間就有了多對多的關係。所以,你可以做的是改變你的文章型號:

class Article(models.Model): 
    class Meta(): 
     db_table = 'article' 

    article_title = models.CharField(max_length=200, blank=False, null=False) 
    article_anchor = models.CharField(max_length=200, blank=False, null=False) 
    article_image = models.ImageField(upload_to='items', blank=False, null=False) 
    article_users = models.ManyToManyField(User) # <- use ManyToManyField instead of IntegerField 

另一種方法是創建一個OrderHistory模型來存儲誰(用戶)購買產品的(文章):

class OrderHistory(models.Model): 
    user = models.ForeignKey(User) 
    article = models.ForeignKey(Article) 
    purchase_date = models.DateTimeField(auto_now_add=True) 

讓我們假設你採用第一種方法。修改模型是不夠的。有你需要添加到您的網站的幾件事情:

  1. 一個用於顯示用戶文章的列表網頁購買

    • 所以你需要一個模板文件,顯示的繳費清單文章
    • 您需要查看功能才能呈現此頁面
    • 此頁面將包含文章列表和用戶選擇要通過複選框購買哪篇文章的方式(或者每篇文章旁邊的許多購買按鈕,您的選擇)。所以bascially你的模板將有一個包含的文章列表和「買入」按鈕,當在「購買」按鈕的用戶點擊,將數據提交給發佈此數據傳回服務器
  2. 一個元素您需要在網址中定義一個網址。PY

    • 在urls.py添加一個新的URL並將其鉤到一個視圖功能
    • 視圖功能將使用request.user在request.POST,以確定它是用戶使用這些數據找出正在購買的文章ID。
    • ,那麼你需要使用

      article = Article.objects.filter(pk=the_id_you_received_from_POST) 
      article.article_users.add(request.user) 
      article.save() 
      
  3. 返回成功信息

閱讀此鏈接,發現從數據庫中的文章開始之前:

https://docs.djangoproject.com/en/1.8/topics/db/examples/many_to_many/

編輯: 作爲丹尼爾指出,刪除用戶配置 user_articles = models.ForeignKey(條,空=真,空=真)

以下行你要想想,如果一個用戶和文章之間的關係是單多對多或多對多。 models.ForeignKey意味着一個用戶可以購買很多物品,但一旦物品已被購買,它只能屬於一個用戶。(這可能不是你想要的)


從一個網頁傳遞數據你的瀏覽功能,有兩種方式:

  1. 通過GET請求:參數被追加到URL的末尾,這裏是它是如何在Django做了一個很好的例子:Capturing url parameters in request.GET

  2. 通過POST請求:通常,你會有一個fo RM頁面並提交按鈕提交數據到一個預定義的URL:

    <form action = "url_for_handling_POST_request" method = "post"> 
    

請按照Django的教程: - https://docs.djangoproject.com/en/1.8/intro/tutorial04/ - https://docs.djangoproject.com/en/1.8/topics/forms/#processing-the-data-from-a-form

在你的情況,你應該使用POST請求。所以請閱讀上面的文檔。它包含一個與您需要的相匹配的示例。

注意:不要忘了插入表單裏面的CSRF令牌或Django會抱怨:

<form ...> 
     {% csrf_token %} 
    </form> 
+0

程,非常感謝描述模型關係的邏輯。我認爲,我需要嘗試兩種方式...而現在,我認爲第二種方式更好,因爲它會自動向我提供有關所有用戶操作的完整統計信息。不是嗎?它可以是非常有用的管理... –

+0

@ s.spirit我會使用第二種方法。但第一個也適用。這真的取決於你想要的。正如您所說,第二種方法的好處是將所有購買歷史存儲在一張表中。所以如果這是你想讓你的用戶看到的東西,那就用第二種方法。 – Cheng

+0

對不起這樣的noob問題,但如何提交數據到我創建的網址?你能寫一個例子嗎?我是否需要將文章的模板包裝到'

'標籤或什麼?或者只需添加一個''標籤? –

相關問題