2017-06-28 27 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

相关问题