2017-07-31 65 views
1

我无法为我的问题找到可靠的答案。我试图在视图中预填充表单。所以当用户使用表单时,一些数据已经被保存了。我想要做的是自动获取用户名和他的组,并将其提供给数据库。但是,当我尝试这样做时,我得到了IntegrityError NOT NULL约束失败。Django IntegrityError在提交表单时(在视图中预填充)

我是新手,我正在学习MDN网络文档。

我views.py:

class AddNewView(generic.View): 
    formClass = AddNewForm 
    template_name = 'myapp/subscription_form.html' 

    def get(self, request): 
     form = self.formClass(None) 
     return render(request, self.template_name, {'form': form}) 

    def post(self, request): 

     form = self.formClass(request.POST) 

     if form.is_valid(): 
      subscription = form.save(commit=False) 

      organization = request.user.groups.values_list('id', flat=True).first() 
      input_user = self.request.user 
      stuff = form.cleaned_data['stuff'] 
      description = form.cleaned_data['description'] 

      subscription.save() 

     return render(request, self.template_name, {'form': form}) 

forms.py:

class AddNewForm(forms.ModelForm): 
    def __init__(self, *args,**kwargs): 
     super (AddNewView, self).__init__(*args,**kwargs) 

    class Meta: 
     model = Subscription 
     fields = [ 
      'stuff', 
      'description', 
     ] 

models.py:

class Subscription(models.Model): 
    organization = models.ForeignKey(Group, help_text="which organization") 
    input_user = models.CharField(max_length=150) 
    input_date = models.DateTimeField(auto_now_add=True) 
    description = models.CharField(max_length=1000, null=True, blank=True, help_text='Description') 
    stuff = models.CharField(max_length=100) 

HTML:

{% extends "base_generic.html" %} 

{% block content %} 

<form action="" method="post"> 
    {% csrf_token %} 
    <table> 
    {{ form.as_table }} 
    </table> 
    <input type="submit" value="Submit" /> 

</form> 
{% endblock %} 

我得到的错误是: 异常类型:IntegrityError 异常值:
NOT NULL约束失败:myapp_myapp.organization_id

我感谢所有帮助,你可以提供

回答

1

你实际上并没有分配值您订阅列

if form.is_valid(): 
     subscription = form.save(commit=False) 

     subscription.organization = request.user.groups.first() 
     subscription.input_user = self.request.user 
     subscription.stuff = form.cleaned_data['stuff'] 
     subscription.description = form.cleaned_data['description'] 

     subscription.save() 
0

在您的形式,

class AddNewForm(forms.ModelForm): 

    class Meta: 
     model = Subscription 
     fields = [ 
      'description', 
      ] 

尝试编辑您的看法是这样,

if form.is_valid(): 
     subscription = form.save(commit=False) 

     subscription.organization = request.user.groups.first() 
     subscription.input_user = self.request.user.username 

     subscription.save() 

我不明白为什么你已经包含在你的领域选项stuff,因为它不是在你的模型中的字段(至少不是一个你”已发布)。