![](/img/trans.png)
[英]How to fix this error in Django, "Cannot assign must be an instance."
[英]Cannot assign must be a instance. Django
我一直在嘗試創建一個有用戶的 Django 項目,這些用戶可以添加他們創建的書名。 但是每次我輸入書名(不在管理頁面上)時,我都會收到此錯誤
Cannot assign "u'Hello Wold'": "Scripter.title" must be a "Book" instance.
模型.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
表格.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
視圖.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))
當然。 不知道這里的混亂在哪里。 Scripter.title
是Book
的外鍵,所以你必須給它一個實際的Book
,而不是一個字符串。
首先,雖然這不是你的問題,但我相信你錯過了一些東西。 如果我理解正確,您希望 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 = 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)
您的書籍模型中沒有主鍵
class Book(models.Model):
script_title = models.CharField(primary_key = True,max_length=100)
def __unicode__(self):
return self.script_title
這應該工作
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.