2012-05-10 2 views
10

필자는 사용자가있는 장고 프로젝트를 만들려고 시도했으며 사용자는 만든 장부 제목을 추가 할 수 있습니다. 그러나 때마다 나는이 오류 (안 관리자 페이지) 책 제목을 입력지정할 수 없습니다 인스턴스 여야합니다. Django

Cannot assign "u'Hello Wold'": "Scripter.title" must be a "Book" instance. 

models.py

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

class Book(models.Model): 
    script_title = models.CharField(max_length=100) 

    def __unicode__(self): 
     return self.script_title 

class Scripter(models.Model): 
    user = models.OneToOneField(User) 
    name = models.CharField(max_length=30) 
    title = models.ForeignKey(Book, null=True, blank=True, default=None) 

    def __unicode__(self): 
     return self.name 

forms.py

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

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','title') 

    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 = Scripter 
     exclude = ('user','name',) 

    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, Book 
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, 'Book': Book} 
    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(): 
      new_script = Book.objects.get_or_create(
       script_title = title_form.cleaned_data['title'] 
      ) 
      new_script.save() 
      script = Book(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)) 

답변

11

물론. 여기서 혼란이 어디인지는 확실하지 않습니다. Scripter.titleBook의 외래 키이므로 문자열이 아닌 실제 Book을 제공해야합니다.

5

처음에는 이것이 귀하의 질문이 아니지만, 나는 당신이 뭔가를 놓쳤다 고 생각합니다. 내가 올바르게 이해한다면, Scripters는 여러 권의 책을 소장하고 싶습니다. 이제 귀하의 모델에는 단 한 권의 책 만있을 수 있습니다. 나는 당신이 달성하려고하는 무엇으로 올바른 해요 경우, 모델 오히려 다음과 같아야합니다

class Book(models.Model): 
    script_title = models.CharField(max_length=100) 
    scripter = models.ForeignKey(Scripter)#A book "remembers" who wrote it 

    def __unicode__(self): 
    return self.script_title 

class Scripter(models.Model): 
    user = models.OneToOneField(User) 
    name = models.CharField(max_length=30) 
    #Scripter can write multiple books, can't he? So the next line is removed, 
    #replaced by an extra line in Book class 

    # title = models.ForeignKey(Book, null=True, blank=True, default=None) 

그런 다음이 같은 스크립터의 책을 액세스합니다 :

질문에 대해서는
scripter = Scripter.objects.get(name="joshua") 
books = scripter.book_set.all() #all books written by joshua 

,

book = Book.objects.get(script_title="some_title") 
scripter.title = book 

을하지만 내가 전에 말했듯이, 당신은 당신의 모델 구조를 변경해야합니다, 그래서 당신은 일을 오히려있을 것입니다 : 현재의 형태로, 당신은 같은 것을 할 필요가

scripter = Scripter.objects.get(name="joshua") 
book = Book.objects.Create(script_title="some title",scripter=scripter) 
관련 문제