2015-10-10 3 views
1

У меня есть модель UserProfile, которая имеет отношения «один к одному» с пользовательской моделью Django.Как вставить данные в пользовательскую модель Django?

Я хотел бы вставить данные в модель UserProfile через зрение AddStory, но я получаю IntegrityError at /AddStory/ NOT NULL constraint failed: portal_userprofile.user_id

Более конкретно, я хочу, чтобы добавить текст в ShoppingHistory атрибут модели UserProfile через форму заданную на домашняя страница. У меня есть другая страница, в которой указано значение этого атрибута (если задано пользователем) на ShoppingHistory.html.

Все пользователи уникальны, как я могу обеспечить, чтобы этот атрибут был добавлен для конкретного пользователя, как только этот пользователь вошел в систему? Как мне обратиться к пользователю после его входа в систему?

models.py

from django.db import models 
from django.contrib.auth.models import AbstractUser 
class UserProfile(AbstractUser):  
    profile_pic = models.ImageField(upload_to='profile_images', blank=True) 
    StaffMember = models.BooleanField(default=False) 
    ShoppingHistory = models.TextField() 
    ShoppingWishList = models.TextField() 

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

views.py:

from django.shortcuts import render 
from django import forms 
from portal import models 
from portal.forms import UserProfileForm 
from django.contrib.auth import authenticate, login 
from django.http import HttpResponseRedirect, HttpResponse 
from django.contrib.auth.decorators import login_required 
# Create your views here. 
def register(request): 

regStatus = False 

if request.method == 'POST': 
    #grab info from raw information 
    profile_form=UserProfileForm(data=request.POST) 

    if profile_form.is_valid(): 
     user=profile_form.save(commit=False) 

     #hash the password for security using the djangohash default method 
     user.set_password(user.password) 


     if 'profile_pic' in request.FILES: 
      profile_pic = request.FILES['profile_pic'] 
     user.save() 

     regStatus = True 

    else: 
     print profile_form.errors 

else: 
    profile_form = UserProfileForm() 

return render(request, 'register.html', {'profile_form': profile_form, 'registered': regStatus}) 

def user_login(request): 

if request.method == 'POST': 
    username = request.POST.get('username') 
    password = request.POST.get('password') 

    user = authenticate(username=username, password=password) 

    if user: 
     login(request, user) 
     return HttpResponseRedirect('/home/') 
    else: 
     return HttpResponse('Invalid login credentials') 

else: 
    return render(request, 'login.html', {}) 

@login_required 
def homepage(request): 


return render(request, 'home.html', {}) 


def AddStory(request): 
if request.method == 'POST': 
    story = request.POST.get('ShoppingHistory') 
    username = request.POST.get('username') 
    p=models.UserProfile(ShoppingHistory=story, username=username) 
    p.save() 

    return render(request, 'ShoppingHistory.html', {'story': p}) 
return render(request, 'ShoppingHistory.html', {}) 

home.html:

{% if user.is_authenticated %} 
    <p> WELCOME, thanks for logging in {{user.username}} </p> 
    <form id="user_form" method="post" action="/AddStory/" enctype="multipart/form-data">  
     {% csrf_token %} 
    <input type="text" name="ShoppingHistory" value="" /> 
    <input name="username" value="{{user.username}}" DISABLED /> 
    <input type="submit" name="submit" value="Add Story" /> 

    {% endif %} 

ShoppingHistory.html:

{% if user.is_authenticated %} 
     {% csrf_token %} 

    <p> WELCOME, thanks for logging in {{user.username}} </p> 
    <p> Your Shopping Stories: </p> 
    <p>{{user.ShoppingHistory}}</p> 

    {% endif %} 

forms.py

from django import forms 
from portal.models import UserProfile 
class UserProfileForm(forms.ModelForm): 

    password = forms.CharField(widget=forms.PasswordInput()) 

class Meta: 
    model = UserProfile 
    fields = ('username', 'first_name', 'last_name', 'email', 'password', 'profile_pic') 

ответ

1

Это гораздо лучше, чтобы создать пользовательский пользователя с помощью AbstractUser:

from django.contrib.auth.models import AbstractUser 


class UserProfile(AbstractUser): 
    pass 

Ваша проблема в том, что, когда ты создайте инстанс UserProfle, который вы должны установить для него, но на самом деле вы хотите его создать, поэтому вам нужно сначала создать пользователя, а затем вы будете иметь пользовательские таблицы в БД. Для чего?

более

о персонализированных пользователей: docs

UPDATE:

Ошибка в этой строке p=models.UserProfile(ShoppingHistory='story',). Ваша модель UserProfile требует, чтобы пользователь создавал UserProfile, и вы не устанавливаете пользовательский instanse. Но я хочу сказать, что у вас неправильный подход к созданию пользовательского пользователя. Идея состоит в том, что в вашей базе данных имеется две таблицы пользователей. Один для пользователя и другой для UserProfile. Они связаны через отношение OneToOne, но это не наследование. Всякий раз, когда вы хотите создать экземпляр UserProfile, вам необходимо создать экземпляр пользователя, созданный для него. Вот и все, поэтому я определенно рекомендую вам использовать AbstractUser для создания пользовательской модели. Тогда вам не нужно думать о том, чтобы указать пользователя при создании пользователя.

UPDATE 2

Вам не нужно, чтобы создать новый пользователь, если вы хотите создать историю для него. Вы можете просто:

def AddStory(request): 
    if request.method == 'POST': 
     story = request.POST.get('ShoppingHistory') 
     request.user.ShoppingStory = story 
     request.user.save() 

     return render(request, 'ShoppingHistory.html', {'story': story}) 
    return render(request, 'ShoppingHistory.html', {}) 
+0

Да, я создал пользователя.Я отредактировал свой вопрос соответственно. У меня есть пользовательские таблицы. Я хочу добавить детали для атрибута ShoppingHistory через форму HTML или форму django. @pythad, пожалуйста, см. правки – thematroids

+0

@thematroids, ошибка в этой строке 'p = models.UserProfile (ShoppingHistory = 'story',)' – pythad

+0

Я пробовал 'p = models.UserProfile (ShoppingHistory = 'story')', но я get 'NOT NULL constraint failed failed: portal_userprofile.user_id'. Какой правильный синтаксис для вставки этих данных? – thematroids

Смежные вопросы