我撕我的头发了,试图找出为什么我的自定义用户配置文件视图不再工作。我正在使用django-allauth,并通过创建一个与用户一对一字段的模型来定制我的用户配置文件。然而,我的观点是抛出错误:
OperationalError at /profile/
no such table: user_profile
Request Method: GET
Request URL: http://localhost:8000/profile/
Django Version: 1.7.4
Exception Type: OperationalError
Exception Value:
no such table: user_profile
Exception Location: /usr/local/lib/python2.7/dist-packages/django/db/backends/sqlite3/base.py in execute, line 485
Python Executable: /usr/bin/python
Python Version: 2.7.6
我的models.py与自定义用户配置文件看起来像这样:
from django.contrib.auth.models import User
from django.db.models.signals import post_save
from django.db import models
from allauth.account.models import EmailAddress
class UserProfile(models.Model):
user = models.OneToOneField(User, related_name='profile')
# user visible settings
stop_reminders = models.BooleanField ( default=False,
help_text = 'Flag if user wants reminders not to be sent.' )
stop_all_email = models.BooleanField ( default=False,
help_text = 'Flag if user wants no email to be sent.' )
# hidden settings
is_premium = models.BooleanField ( default=False,
help_text = 'Flag if user has the premium service.' )
def __unicode__(self):
return "{}'s profile".format(self.user.username)
class Meta:
db_table = 'user_profile'
def account_verified(self):
if self.user.is_authenticated:
result = EmailAddress.objects.filter(email=self.user.email)
if len(result):
return result[0].verified
return False
#User.profile = property(lambda u: UserProfile.objects.get_or_create(user=u)[0])
def create_user_profile(sender, instance, created, **kwargs):
if created:
profile, created = UserProfile.objects.get_or_create(user=instance)
post_save.connect(create_user_profile, sender=User)
我的视图,这是一个设置用户配置文件设置的地方,看起来像这样:
@login_required
def user_settings (request):
"""
User settings view, handles changing of user settings and
entry distribution (eventually)
"""
if request.method == 'POST': # If the form has been submitted...
form = UserProfileForm(request.POST, instance=request.user.profile) # A form bound to the POST data
if form.is_valid(): # All validation rules pass
form.save ()
return render_to_response('sm/profile_update_success.html',
{},
context_instance=RequestContext(request))
else:
# create unbound form with initial values generated
# from the user's profile
form = UserProfileForm (instance=request.user.profile)
return render ( request, 'profile.html', { 'form': form, } )
直到最近,这是工作正常,我不知道是什么改变了,使它停止。有人能解释一下吗?
我使用的是Django-1.7.4和django-allauth-0.19.1。对于调试,我使用了sqllite,我已经尝试使用python manage.py migrate
和python manage.py syncdb
创建了它。
6条答案
按热度按时间zvms9eto1#
首先,如果它以前有效,我无法解释为什么它不再有效。您应该检查sqlite文件本身,并查看表是否存在。(该文件通常位于根目录下,名为
db.sqlite3
,可以使用任何标准sqlite浏览器打开)您提到您已经运行了migrate,但是实际的迁移已经在那里了吗?
如果没有,请先运行
python manage.py makemigrations
。如果需要,请验证迁移文件本身。还有一个
python manage.py inspectdb
命令,可以给予您对正在使用的模型的一些了解。如果仍然没有,你当然可以从头开始。我可能错过了一条捷径,但我会:
1.创建需要保留的数据的副本(
python manage.py dumpdata --indent=4 <appname>
)(将其保存到fixture中)1.删除迁移文件
1.删除
db.sqlite3
1.运行
python manage.py makemigrations
1.运行
python manage.py migrate
1.使用
python manage.py loaddata <fixture-name>
重新加载旧数据rur96b6h2#
我也遇到过同样的问题,但我的解决方案不同。我在清理时不小心删除了migrations目录中的init.py,这意味着某些迁移没有运行,从而产生相同的错误。更换它解决了这个问题。
ntjbwcob3#
Gahh,答案是我已经从
INSTALLED_APPS
注解掉了我的主应用程序条目。太傻了。y53ybaqx4#
我也有同样的问题。为了解决这个问题,我通过Control+C退出服务器。而不是通过运行以下两个命令进行迁移:$ python manage.py makemigrations it tells me“配置文件”的迁移:
profiles/migrations/0001_initial.py
运行
$ python manage.py migrate
它告诉我
要执行的操作:应用所有迁移:admin、auth、contenttypes、profile、sessions运行迁移:
正在应用配置文件.0001_initial.好
现在我再次运行服务器$ python manage.py runserver
当我创建档案时
[24/Aug/2018 19:36:16]“GET /admin/profiles/profile/add/ HTTP/1.1”200 4381
[24/Aug/2018 19:36:19]“POST /admin/profiles/profile/add/ HTTP/1.1”302 0
[24/Aug/2018 19:36:19]“GET /admin/profiles/profile/ HTTP/1.1”200 4376
[24/Aug/2018 19:36:19]“GET /admin/jsi18n/ HTTP/1.1”200 3217
[24/Aug/2018 19:36:19]“GET/static/admin/css/changelists.css HTTP/1.1”200 6170
[24/Aug/2018 19:36:19]“GET/static/admin/img/tooltag-add.svg HTTP/1.1”200 331
[24/Aug/2018 19:36:19]“GET/static/admin/img/icon-yes.svg HTTP/1.1”200 436
并创建了profile。希望对你有帮助。
laik7k3q5#
好吧,看起来你忘记运行migrations命令了;然后运行下面的命令:在Django shell中:
然后,
knpiaxh16#
$ python manage.py migrate --run-syncdb
这是个好办法试试看