2015-11-02 207 views
2

我正在一个项目中,我想让很多用户注册许多offering_funds,所以我添加了一个ManyToManyField。我还希望Django能够自动找出哪个用户已经登录,并自动填充用户字段,所以我把它写在了我的views.py文件中。然而在这样做时,我遇到了错误:Django:“NOT NULL约束失败:users_investment.user_id”错误

NOT NULL constraint failed: users_investment.user_id

这里是我的models.py:

# Not sure if this class is relevant to my question 
class UserProfile(models.Model): 
    user = models.OneToOneField(User) 
    first_name = models.CharField(max_length=24) 
    last_name = models.CharField(max_length=24) 
    phone_number = models.CharField(max_length=12) 
    account_type = models.CharField(max_length=55, choices=ACCOUNT_TYPES) 

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

class Investment(models.Model): 
    user = models.ManyToManyField(User, blank=True) 
    offered_fund = models.ForeignKey(OfferedFunds) 
    amount = models.IntegerField(default=0) 
    purchase_date = models.DateTimeField(auto_now_add=True) 

    def __int__(self): 
     return self.offered_fund.fund_name.name 

我forms.py:

class InvestmentForm(forms.ModelForm): 
    class Meta: 
     model = Investment 
     fields = ('offered_fund','amount') 
     exclude = ['user'] 

终于,我的看法。 py:

def of_details(request, slug): 
    context_dict = {} 

    of = get_object_or_404(OfferedFunds, slug=slug) 
    context_dict['of'] = of 

    default_state = OfferedFunds.objects.get(slug=slug) 
    form = InvestmentForm(request.POST or None, initial={'offered_fund': default_state}) 

    if form.is_valid(): 
     instance = form.save(commit=False) 
     #instance.user = request.user 
     instance.offered_fund = default_state 
     instance.save() 
     instance.user.add(request.user) # Where the problem started 
    context_dict['form'] = form 

    return render(request, 'funds/offered-funds-details.html', context_dict) 

在我的views.py中我有评论编辑导致这个问题的代码位。我无法想象为什么Django会疯狂,用户字段有一个值(非空)。任何人有任何想法,我如何解决这个问题?我没有一个python manage.py flush来清除我的数据库,但仍然没有运气。由于

+0

被记录在用户查看哪些用户例如在'请求。?。用户' – Rohan

+0

是的,用户登录后,我做了一个'print(“request.user”)'来检查。 – ng150716

回答

2

我觉得你的问题是,您收到了anonymous user object,而不是完全认证的用户(Django会自动填充request.user一个匿名用户,如果通过身份验证的用户没有登录该id匿名用户永远是None - 因此数据库约束失败

你需要确保你的用户是通过检查是否request.user.is_authenticated()第一匿名:

if request.user.is_authenticated(): 
    instance.user.add(request.user) 
+0

不,我登录后,仍然出现错误,我甚至尝试过'print(“request.user”)'来确保。 – ng150716

+0

'request.user'的内容是什么? – solarissmoke

+0

'request.user'返回登录用户的名称(我以您在运行syncdb时创建的超级用户身份登录)。我的models.py中也有一个UsersProfile类。我编辑了我原来的帖子以反映这一点。 – ng150716

相关问题