2017-06-28 28 views
0

我是django的新手,我的任務是讓用戶在登錄後能夠創建很多配置文件在Django auth.models用戶一對多(1048,「列'user_id'不能爲空')

這是我的models.py:

class Profile(models.Model): 
    user = models.ForeignKey(User, on_delete=models.CASCADE) 
    name = models.CharField(blank=False, max_length=100) 
    lastname = models.CharField(blank=False, max_length=100) 
    city = models.CharField(blank=True, max_length=100) 
    country = models.CharField(blank=True, max_length=100) 
    phonenumber = models.CharField(blank=False, null=True, max_length=20) 
    email = models.EmailField(blank=False, max_length=100) 
    date_of_birth = models.DateField(blank=True, null=True) 
    date_of_addition = models.DateField(auto_now=True, editable=False, null=True) 

當我創建我的用戶,請登錄並按創建配置文件按鈕,我得到: django.db.utils.IntegrityError:(1048,「列'user_id'不能爲空「)

Th是是我的views.py:

@login_required 
def profile_create(request): 
    data = dict() 
    if request.method == 'POST': 
     form = ProfileForm(request.POST) 
     if form.is_valid(): 
      form.save() 
      data['form_is_valid'] = True 
      profiles = Profile.objects.all() 
      data['html_profile_list'] = render_to_string('basic_app/users_list_1_10.html', {'profiles': profiles}) 
     else: 
      data['form_is_valid'] = False 
    else: 
     form = ProfileForm() 
    context = {'form': form} 
    data['html_form'] = render_to_string('basic_app/partial_profile_create.html', context, request=request) 
    return JsonResponse(data) 


def register(request): 
    registered = False 
    if request.method == "POST": 
     user_form = UserForm(data=request.POST) 
     if user_form.is_valid(): 
      user = user_form.save() 
      user.set_password(user.password) 
      user.save() 
      registered = True 
     else: 
      print(user_form.errors) 
    else: 
     user_form = UserForm() 
    return render(request,'basic_app/registration.html',{'user_form':user_form,'registered':registered}) 

這是我forms.py:

from django import forms 
from django.forms import ModelForm 
from django.contrib.auth.models import User 
from .models import Profile 

class ProfileForm(ModelForm): 
    class Meta: 
     model = Profile 
     fields = ('name', 'lastname', 'city', 'country', 'phonenumber', 'email', 'date_of_birth') 


class UserForm(ModelForm): 
    password = forms.CharField(widget=forms.PasswordInput()) 
    username = forms.CharField(help_text=False) 

    class Meta(): 
     model = User 
     fields = ('username','password') 

感謝

回答

0

我應該保存ProfileForm前要求用戶:

@login_required 
def profile_create(request): 
    data = dict() 

    if request.method == 'POST': 
     form = ProfileForm(request.POST) 
     if form.is_valid(): 
      add = form.save(commit=False) 
      add.user = request.user 
      add.save() 
      data['form_is_valid'] = True 
      profiles = Profile.objects.all() 
      data['html_profile_list'] = render_to_string('basic_app/users_list_1_10.html', {'profiles': profiles}) 
     else: 
      data['form_is_valid'] = False 
    else: 
     form = ProfileForm() 

    context = {'form': form} 
    data['html_form'] = render_to_string('basic_app/partial_profile_create.html', context, request=request) 
    return JsonResponse(data) 
0

它發生,因爲你的Profile模型,你有user場是ForeignKey。在Django ForeignKey是默認情況下需要的,這意味着您不能創建新的Profile而不指定user字段。但您不提供ProfileForm中的用戶。

您可以在ProfileForm提供用戶或一組user場不加要求:

user = models.ForeignKey(User, blank=True, null=True, on_delete=models.CASCADE) 
+0

卡米爾,感謝您的關注。如果我創建'user = models.ForeignKey(User,blank = True,null = True'),那麼我將獲得所有db_users,其配置文件顯示在我的數據表中。但是,我只想顯示實際登錄用戶的配置文件。如果我在ProfileForm中提供用戶,所以我想這將是一個在創建Profile時有一些東西可以通過的字段,但我希望它是隻有登錄的用戶才能創建任何數量的可以連接的配置文件給他一對多的關係,可能是我應該在ProfileForm中保存配置文件給這個用戶,有可能嗎? – Stanislav

相關問題