2014-10-16 90 views
0

请问您可以用Django和自定义用户模型来帮助我吗?我是一个Django世界的新手,所以我开始从最新的1.7版本中学习。在我的项目中,我使用的是django-allauth软件包,我想创建来自contrib.auth的标准用户类和我的自定义模型“用户”之间的OneToOne关系。Django 1.7旧式自定义用户模型

#models.py 

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

class Profile(models.Model): 
    user=models.OneToOneField(User) 
    f_name=models.CharField(null=True, blank=True, max_length='30') 
    l_name=models.CharField(null=True, blank=True, max_length='30') 
    birth_date=models.DateField(null=True, blank=True) 
    company=models.CharField(null=True, blank=True, max_length='30') 
    rate=models.FloatField(null=True, blank=True, default=0.0) 
    skills=models.CharField(null=True, blank=True, max_length='255') 
    bill_rate=models.CharField(null=True, blank=True, max_length='255') 
    contacts=models.CharField(null=True, blank=True, max_length='255') 
    portfolio=models.CharField(null=True, blank=True, max_length='127') 
    avatar = models.ImageField(upload_to='/static/img/%Y/%m/%d', blank=True, null=True) 

    def __unicode__(self): 
     return self.user.username 

这是forms.py

#forms.py 
from django.forms import ModelForm 
from users.models import Profile 


class ProfileForm(ModelForm): 

    class Meta: 
     model = Profile 
     fields = ('f_name', 'l_name', 'company',) 

这是一个模板:

{% extends "base_.html" %} 

    {% block main_content%} 
    <div> 
    {% if user.is_authenticated %} 
     <p>Welcome, {{ request.user.id }}!</p> 
     <form id="profile_form" method="POST" action="/accounts/profile" enctype="multipart/form-data"> 
      {% csrf_token %} 
      {{ profile_form.as_p }} 
      <input type="submit" name="submit" value="Save" /> 
     </form> 
    {% endif %} 
    </div> 
    {% endblock%} 

而且views.py:

from django.http import HttpResponse 
from django.template import RequestContext 
from django.conf import settings 
from django.shortcuts import render, render_to_response 
from models import Profile 
from forms import ProfileForm 

def edit(request): 
    profile_form = ProfileForm() 
    user = request.user 
    if request.method == 'POST': 
     profile_form = ProfileForm(data=request.POST, instance=user) 
     if profile_form.is_valid(): 
      profile = profile_form.save(commit=False) 
      profile.user = user 
      profile.save() 
      return render_to_response("profile.html", RequestContext(request)) 

    return render_to_response('profile_edit.html', RequestContext(request, {'profile_form' : profile_form})) 

我建这一切的文件,根据通过本教程: http://www.tangowithdjango.com/book/chapters/login.html

最后,所有这些工作正常,但是当我按下保存按钮时,POST表单不起作用。我看不到数据库中的任何更改。重定向工作良好,实际上似乎一切正常,但我没有任何数据(我使用的是postgres)。

我花了很多钱找到答案,并尝试几乎所有的互联网,但我仍然有这个问题。也许我不明白它是如何从django文档工作的,但我尝试了相同的方法,仍然有问题。

预先感谢您!

UPDATE: 我的urls.py

from django.conf.urls import patterns, include, url 
from django.contrib import admin 

urlpatterns = patterns('', 
    # Examples: 
    url(r'^$', 'laniakea.views.home', name='home'), 
    # url(r'^blog/', include('blog.urls')), 

    url(r'^admin/', include(admin.site.urls)), 
    url(r'^accounts/', include('allauth.urls')), 
    url('accounts/profile', 'laniakea.views.prof', name='prof'), 
    url(r'^edit', 'users.views.edit', name='edit'), 
) 
+0

你可以显示urls.py吗? – 2014-10-16 12:27:13

+0

您的表单不会张贴到您展示的视图,而是发布到“laniakea.views.prof”上完全不同视图提供的“accounts/profile”中。那是什么意思? – 2014-10-16 13:04:01

+0

Prof只是一个带有“欢迎,%username%”和“编辑”按钮的模板。而'users.views.edit'是ProfileForm的一个页面。 – NONAMA 2014-10-16 13:09:47

回答

0

我找到了解决办法!正如Daniel所说,我改变了“action”属性来将POST请求转移到同一个表单中。正如我发现的,我没有创建一个用户父类的正确实例。其实,我不需要使用它们。

#views.py 

from django.template import RequestContext 
from django.shortcuts import render 
from models import Profile 
from forms import ProfileForm 

def edit(request): 
    user = request.user 
    if request.method == 'POST': 
     profile_form = ProfileForm(request.POST) 
     if profile_form.is_valid(): 
      profile = profile_form.save(commit=False) 
      profile.user = user 
      profile.save() 
      return HttpResponseRedirect('accounts/profile') 
    else: 
     profile_form = ProfileForm() 

    return render(request, 'profile_edit.html', {'profile_form' : profile_form}) 

#profile_edit.html 

{% extends "base_.html" %} 

{% block main_content%} 
<div> 
{% if user.is_authenticated %} 
    <p>Welcome, {{ request.user.id }}!</p> 
    <form id="profile_form" method="POST" action="" enctype="multipart/form-data"> 
     {% csrf_token %} 
     {{ profile_form.as_p }} 
     <input type="submit" name="submit" value="Save" /> 
    </form> 
{% endif %} 
</div> 
{% endblock%} 

非常感谢您的帮助,祝你好运!

相关问题