2014-10-16 94 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%} 

非常感謝您的幫助,祝你好運!

相關問題