【问题标题】:Create User Specific Objects in Django在 Django 中创建用户特定对象
【发布时间】:2012-05-18 09:45:39
【问题描述】:

我一直在尝试创建一个拥有用户的 django 项目,这些用户可以添加他们创建的书籍的标题。只有用户才能查看他的书名。我想知道如何在models.py、forms.py 和views.py 中创建一个类,它将用户和他们的书名联系在一起。这是我目前所拥有的。

models.py

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

class Scripter(models.Model):
    user = models.OneToOneField(User)
    name = models.CharField(max_length=30)

    def __unicode__(self):
        return self.name

class Title(models.Model):
    author = models.ForeignKey(Scripter)

    def __unicode__(self):
        return self.script_title

forms.py

from django import forms
from django.contrib.auth.models import User
from django.forms import ModelForm
from scripters.models import Scripter, Title

class RegistrationForm(ModelForm):
    username = forms.CharField(label=(u'User Name'))
    email = forms.EmailField(label=(u'Email Address'))
    password = forms.CharField(label=(u'Password'), widget=forms.PasswordInput(render_value=False))
    password1 = forms.CharField(label=(u'Verify Password'), widget=forms.PasswordInput(render_value=False))

    class Meta:
        model = Scripter
        exclude = ('user',)

    def clean_username(self):
        username = self.cleaned_data['username']
        try:
            User.objects.get(username=username)
        except User.DoesNotExist:
            return username
        raise forms.ValidationError("User Name has been taken!")

    def clean(self):
        if self.cleaned_data['password'] != self.cleaned_data['password1']:
        raise forms.ValidationError("The passwords did not match")
        else:
            return self.cleaned_data

class LoginForm(forms.Form):
    username = forms.CharField(label=(u'Username'))
    password = forms.CharField(label=(u'Password'), widget=forms.PasswordInput(render_value=False))

class CreateScript(ModelForm):
    title = forms.CharField(label=(u'Script Title'))

    class Meta:
        model = Title

    def clean_title(self):
        title = self.cleaned_data['title']
        return title

views.py

from django.http import HttpResponseRedirect
from django.contrib.auth.models import User
from django.contrib.auth.decorators import login_required
from django.shortcuts import render_to_response
from django.template import RequestContext
from scripters.forms import RegistrationForm, LoginForm, CreateScript
from scripters.models import Scripter, Title
from django.contrib.auth import authenticate, login, logout

def ScripterRegistration(request):
    if request.user.is_authenticated():
        return HttpResponseRedirect('/profile/')
    if request.method =='POST':
        form = RegistrationForm(request.POST)
        if form.is_valid():
            user = User.objects.create_user(username=form.cleaned_data['username'],
                email = form.cleaned_data['email'],
                password = form.cleaned_data['password']
            )
            user.save()
            scripter = Scripter(user=user, name=form.cleaned_data['name'])
            scripter.save()

            return HttpResponseRedirect('/profile/')
        else:
            return render_to_response('index.html', {'form': form}, context_instance=RequestContext(request))
    else:
        form = RegistrationForm()
        context = {'form': form}
        return render_to_response('index.html', context, context_instance=RequestContext(request))

@login_required
def Profile(request):
    if not request.user.is_authenticated():
        return HttpResponseRedirect('/login/')
    Scripter = request.user.get_profile
    context = {'Scripter': Scripter}
    return render_to_response('profile.html', context, context_instance=RequestContext(request))

def LoginRequest(request):
    if request.user.is_authenticated():
        return HttpResponseRedirect('/profile/')
    if request.method == 'POST':
        submit = LoginForm(request.POST)
        if submit.is_valid():
            username = submit.cleaned_data['username']
            password = submit.cleaned_data['password']
            scripter = authenticate(username=username, password=password)
            if scripter is not None:
                login(request, scripter)
                return HttpResponseRedirect('/profile/')
            else:
                return HttpResponseRedirect('/login/')
    else:
        submit = LoginForm()
        context = {'submit': submit}
        return render_to_response('login.html',context, context_instance=RequestContext(request))

def LogoutRequest(request):
    logout(request)
    return HttpResponseRedirect('/login/')

@login_required
def NewScript(request):
    if not request.user.is_authenticated():
        return HttpResponseRedirect('/login/')
    if request.method =='POST':
        title_form = CreateScript(request.POST)
        if title_form.is_valid():
            title = User.objects.get_or_create(
                Title = title_form.cleaned_data['title'],
            )
            title.save()
            script = Title(script_title=title_form.cleaned_data['title'])
            script.save()

            return HttpResponseRedirect('/edit/')
        else:
            return render_to_response('NewScript.html', {'title_form': title_form}, context_instance=RequestContext(request))
    else:
        title_form = CreateScript()
        context = {'title_form': title_form}
        return render_to_response('NewScript.html', context, context_instance=RequestContext(request))

【问题讨论】:

  • 那么...你需要做什么?
  • 我希望用户能够添加他们写的书的名字,但只有他们可以看到它们。有点像在线目录。我已经完成了注册和登录工作,我只想要一个将用户和书籍联系起来的课程。因此,本质上,当他们登录时,他们将点击“添加图书”,这会将他们重定向到他们将输入姓名的表单。这本书被添加到他们的目录中。
  • 您是否尝试为用户字段提供初始值,并将其从表单中排除?
  • 我该怎么做。对不起,我是菜鸟

标签: python django object models


【解决方案1】:

我认为您要问的是如何获取特定用户拥有的标题列表。

使用反向关系相当容易:

scripter.title_set.all()

将为您提供 Scripter 实例拥有的所有书籍。

【讨论】:

  • 这很有帮助,但他们如何添加新标题?
  • 只需使用 scripter = Scripter.objects.get(pk=request.user) 然后 Title.objects.create(author=scripter) 如果您设置了 Scripter,您也可以使用 get_profile()就在您的设置中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-02-10
  • 2019-09-23
  • 1970-01-01
  • 1970-01-01
  • 2017-11-13
  • 1970-01-01
相关资源
最近更新 更多