简体   繁体   English

在Django中创建用户特定的对象

[英]Create User Specific Objects in Django

Ive been trying to create a django project that has users and those users can add titles of books they have created. 我一直在尝试创建一个具有用户的django项目,这些用户可以添加他们创建的书的标题。 Only the user will be able to view the titles of his books. 只有用户才能查看其书名。 I was wondering how can I create a class in models.py, forms.py, & views.py that will tie the user and the titles of their books together. 我想知道如何在models.py,forms.py和views.py中创建一个将用户及其书名联系在一起的类。 Here is what I have so far. 这是我到目前为止所拥有的。

models.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 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))

I think what you're asking is how do I get the list of titles that are owned by a specific user. 我想您要问的是如何获取特定用户拥有的书名列表。

This is rather easy using a reverse relationship: 使用反向关系非常容易:

scripter.title_set.all()

Will get you all the books owned by an instance of Scripter. 将为您提供Scripter实例拥有的所有书籍。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM