在修改了models.py以後,咱們想要更新數據庫的表,使用了python manage.py makemigrations 命令以後,顯示出"No changes detected",咱們所以沒法migrate這個數據庫。html
解決辦法:
在makemigrations 後面增長APP的名字
好比說:python
python manage.py makemigrations coder_market
這時就能檢測出哪些表有變化了數據庫
網上的方法大可能是修改admin.py來修改,可是我使用這樣的辦法無效。發現將register的代碼放到models.py時可使用django
from __future__ import unicode_literals from django.contrib.auth.models import User from django.db import models from django.contrib import admin ''' class user_login(models.Model): username = models.CharField(max_length=30) password = models.CharField(max_length=30) identity = models.CharField(max_length=15) ''' ''' class identity(models.Model): username = models.ForeignKey(User) iden = models.CharField(max_length=10) ''' class publisher(models.Model): username = models.CharField(max_length=30) order_project = models.IntegerField() presonal_information = models.CharField(max_length=100) accept_information = models.TextField() class receiver(models.Model): username = models.CharField(max_length=30) get_project = models.IntegerField() presonal_information = models.CharField(max_length=100) tag = models.CharField(max_length=50) accept_information = models.TextField() class manager(models.Model): username = models.CharField(max_length=30) manage_project = models.IntegerField() presonal_information = models.CharField(max_length=100) tag = models.CharField(max_length=50) accept_information = models.TextField() class project(models.Model): number = models.IntegerField() project_publisher = models.CharField(max_length=30) project_content = models.TextField() project_receiver = models.CharField(max_length=30) project_manager = models.CharField(max_length=30) tag = models.CharField(max_length=50) class UserProfile(models.Model): #user = models.ForeignKey(User, unique=True, verbose_name='profile') user = models.OneToOneField(User, unique=True) identity = models.CharField(max_length=15) admin.site.register(publisher) admin.site.register(receiver) admin.site.register(project) admin.site.register(UserProfile)
遇到了一個登陸失敗的問題。
一個初始版本的login以下:ide
def login(request): if request.method == "POST": print request.POST['login_username'],request.POST['login_password'] user = django.contrib.auth.authenticate(username=request.POST['login_username'], password=request.POST['login_password']) if user is not None: django.contrib.auth.login(request, user) return HttpResponseRedirect('/hello') else: return HttpResponse('fail to login') return render(request, 'login.html', {})
我發如今判斷user是否是存在的時候就一直判斷不存在,反覆檢查登陸的代碼,雖然初級,可是應該是正確的。最後發現問題存在於註冊上
註冊時,咱們的代碼以下post
def register(request): if request.method == 'POST': reg = User() reg.username = request.POST['register_username'] reg.password = request.POST['register_password'] #問題出在這一行 reg.save() pro = UserProfile(user_id=reg.id) pro.identity = request.POST['register_identity'] pro.save() return HttpResponse("run!") return render(request, 'register.html', {})
事實上問題出在密碼的設置上,咱們應該使用django內置的set_password
方法,便可解決問題。code
reg.set_password(request.POST['register_username'])
出現問題的緣由是在model.py內的類沒有加__unicode__()
方法,致使admin不知道拿哪個字段來顯示。改進的方法相似下面的代碼orm
from __future__ import unicode_literals from django.contrib import admin from django.contrib.auth.models import User from django.db import models # Create your models here. class publisher(models.Model): username = models.CharField(max_length=30) order_project = models.IntegerField() presonal_information = models.CharField(max_length=100) accept_information = models.TextField() #下面這個方法加上 def __unicode__(self): return self.username
解決方法:在HTML表單內加上{% csrf_token %}csrf
<form method="post">{% csrf_token %} <table> 後面省略
問題多是對數據庫作了修改以後只進行了python manage.py makemigrations
沒有作python manage.py migrate
我想問題多是在django 的數據庫抽象層作了改動以後,可是鏈接的數據庫並無改變表或者是字段,在增刪改查的時候django在對應的數據庫裏找不到相應的數據htm
能夠用相似下面的方法。核心是DoesNotExist
異常
try: p = User.objects.get(username='haha') except User.DoesNotExist: return HttpResponseRedirect('/hello')