我是django的新手,并试图学习如何用它制作一个简单的应用程序。我确实设法在相同的视图功能工作中注册。然而,当我开始添加模型和表格时,我搞砸了,我真的不明白什么是错的。我花了一天时间寻找解决方案,但我无法理解。有什么帮助吗?
models.py
class UserProfile(models.Model):
user = models.OneToOneField(User)
def __unicode__(self):
return self.user.username
class Posts(models.Model):
content = models.CharField(max_length=150)
user = models.ForeignKey(UserProfile)
creation_date = models.DateTimeField(auto_now=True, blank=True)
forms.py
class UserSignUpForm(forms.ModelForm):
username = forms.CharField(required=True, widget=forms.widgets.TextInput(attrs={'placeholder': 'Username', 'class' : 'username'}))
password = forms.CharField(required=True, widget=forms.widgets.PasswordInput(attrs={'placeholder': 'Password', 'class' : 'password'}))
def is_valid(self):
form = super(UserSignUpForm, self).is_valid()
for f, error in self.errors.items():
if f != '__all_':
self.fields[f].widget.attrs.update({'class': 'error', 'value': strip_tags(error)})
return form
class Meta:
model = UserProfile
fields = ('username', 'password',)
class PostsForm(forms.ModelForm):
posts = forms.CharField(max_length=150, widget=forms.widgets.TextInput(attrs={'placeholder': 'What\'s in your mind?'}))
class Meta:
model = Posts
fields = ('posts',)
views.py
def index(request):
if request.user.is_authenticated():
user = request.user
return render(request, 'userHome.html', {
'user': user,
'posts' : posts
})
return render(request, 'userHome.html')
def signup(request):
context = RequestContext(request)
registered = False
if request.method == 'POST' and 'signIn' in request.POST:
username = request.POST['username']
password = request.POST['password']
user = authenticate(username=username, password=password)
if user is not None:
if user.is_active:
login(request, user)
return redirect(index)
else:
return redirect(signup)
else:
return HttpResponse('invalid user')
if request.method == 'POST' and 'signUp' in request.POST:
form = UserSignUpForm(request.POST)
if form.is_valid():
user = form.save(commit=True)
user.set_password(user.password)
user.save()
return redirect(index)
else:
return HttpResponse('this username already exist')
else:
form = UserSignUpForm()
return render(request, 'login.html', {
'form' : form,
'registered' : registered
}, context)
def posts(request):
if request.user.is_authenticated():
user = request.user
return render(request, 'userHome.html', {
'user': user,
})
完整追溯
Environment:
Request Method: POST
Request URL: http://127.0.0.1:8000/signup
Django Version: 1.10.5
Python Version: 3.5.2
Installed Applications:
['django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'app']
Installed Middleware:
['django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware']
Traceback:
File "/Applications/anaconda/lib/python3.5/site-packages/django/db/backends/utils.py" in execute
64. return self.cursor.execute(sql, params)
File "/Applications/anaconda/lib/python3.5/site-packages/django/db/backends/sqlite3/base.py" in execute
337. return Database.Cursor.execute(self, query, params)
The above exception (NOT NULL constraint failed: app_userprofile.user_id) was the direct cause of the following exception:
File "/Applications/anaconda/lib/python3.5/site-packages/django/core/handlers/exception.py" in inner
39. response = get_response(request)
File "/Applications/anaconda/lib/python3.5/site-packages/django/core/handlers/base.py" in _get_response
187. response = self.process_exception_by_middleware(e, request)
File "/Applications/anaconda/lib/python3.5/site-packages/django/core/handlers/base.py" in _get_response
185. response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/Users/user/lsProject/ls/app/views.py" in signup
45. user = form.save(commit=True)
File "/Applications/anaconda/lib/python3.5/site-packages/django/forms/models.py" in save
453. self.instance.save()
File "/Applications/anaconda/lib/python3.5/site-packages/django/db/models/base.py" in save
796. force_update=force_update, update_fields=update_fields)
File "/Applications/anaconda/lib/python3.5/site-packages/django/db/models/base.py" in save_base
824. updated = self._save_table(raw, cls, force_insert, force_update, using, update_fields)
File "/Applications/anaconda/lib/python3.5/site-packages/django/db/models/base.py" in _save_table
908. result = self._do_insert(cls._base_manager, using, fields, update_pk, raw)
File "/Applications/anaconda/lib/python3.5/site-packages/django/db/models/base.py" in _do_insert
947. using=using, raw=raw)
File "/Applications/anaconda/lib/python3.5/site-packages/django/db/models/manager.py" in manager_method
85. return getattr(self.get_queryset(), name)(*args, **kwargs)
File "/Applications/anaconda/lib/python3.5/site-packages/django/db/models/query.py" in _insert
1045. return query.get_compiler(using=using).execute_sql(return_id)
File "/Applications/anaconda/lib/python3.5/site-packages/django/db/models/sql/compiler.py" in execute_sql
1054. cursor.execute(sql, params)
File "/Applications/anaconda/lib/python3.5/site-packages/django/db/backends/utils.py" in execute
79. return super(CursorDebugWrapper, self).execute(sql, params)
File "/Applications/anaconda/lib/python3.5/site-packages/django/db/backends/utils.py" in execute
64. return self.cursor.execute(sql, params)
File "/Applications/anaconda/lib/python3.5/site-packages/django/db/utils.py" in __exit__
94. six.reraise(dj_exc_type, dj_exc_value, traceback)
File "/Applications/anaconda/lib/python3.5/site-packages/django/utils/six.py" in reraise
685. raise value.with_traceback(tb)
File "/Applications/anaconda/lib/python3.5/site-packages/django/db/backends/utils.py" in execute
64. return self.cursor.execute(sql, params)
File "/Applications/anaconda/lib/python3.5/site-packages/django/db/backends/sqlite3/base.py" in execute
337. return Database.Cursor.execute(self, query, params)
Exception Type: IntegrityError at /signup
Exception Value: NOT NULL constraint failed: app_userprofile.user_id
更新
我发现了错误,我不知道这本书中是否是错误或错字(说使用models.py中声明的模型)我正在学习Django。错误在form.py中。如果我使用:
Class Meta:
user = UserProfile
它会抛出NULL错误,但将其更改为User它不会!但是,我使用这种方式创建用户,它使用UserProfile!
if user_form.is_valid():
user = User.objects.create_user(
username=user_form.cleaned_data['username'],
password=user_form.cleaned_data['password'],)
user.save()
return redirect(index)
如果有人能用简单的话语来解释原因,那就太好了。