2015-05-01 114 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问题,但如何提交数据到我创建的网址?你能写一个例子吗?我是否需要将文章的模板包装到'

'标签或什么?或者只需添加一个''标签? –

相关问题