2017-05-26 43 views
0

我有一個django應用程序,每個註冊用戶都可以爲其創建類別。對於我使用django-all-auth的認證。我models.py看起來是這樣的:如何將已通過身份驗證的用戶傳遞給django中的forms.py

class Profile(models.Model): 
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False) 
    user = models.OneToOneField(User, on_delete=models.CASCADE) 
    create_date = models.DateTimeField('date added', auto_now_add=True) 
    modify_date = models.DateTimeField('date modified', default=timezone.now) 

class Category(models.Model): 
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False) 
    user = models.ForeignKey(Profile, on_delete=models.CASCADE) 
    name = models.CharField(max_length=200, unique=True) 
    create_date = models.DateTimeField('date added', auto_now_add=True) 
    modify_date = models.DateTimeField('date modified', default=timezone.now) 

在索引頁面,用戶可以看到創建的類別,並創建新的。 的views.py:

def CategoryView(request): 
    user = 0 
    if request.user.is_authenticated(): 
     user = request.user 
    form = CategoryNameForm() 
    form.user = user 
    context = { 
     'categories': Category.objects.all(), 
     'form': form, 
     'user':user, 
     } 
    if request.method == 'POST': 
     form = CategoryNameForm(request.POST) 
     form.user = user 
     if form.is_valid(): 
      form.save() 
    return render(request, 'myapp/index.html',context) 

forms.py: 類CategoryNameForm(forms.ModelForm):

class Meta: 
     model = Category 
     fields = ('name',) 

認證工作。所以我想幹脆把用戶領域傳遞到形式:

class CategoryNameForm(forms.ModelForm): 

     class Meta: 
      model = Category 
      fields = ('name','user',) 

隱藏它,然後,只需通過JS選擇它,因爲用戶是在上下文。我只是想知道是否有更簡單的方法。這form.user = user因爲某些原因沒有工作,我得到一個NOT NULL約束失敗

+0

所以你想確保剛剛登錄的用戶可以訪問?那麼view.py文件中的'@ login_required'怎麼樣? – hansTheFranz

回答

1

有幾種方式,但這裏是一個:

class CategoryNameForm(forms.ModelForm): 
    class Meta: 
     model = Category 
     fields = ('name',) # take out user you don't need it here 

    def save(self, **kwargs): 
     user = kwargs.pop('user') 
     instance = super(CategoryNameForm, self).save(**kwargs) 
     instance.user = user 
     instance.save() 
     return instance 

然後在視圖:

if form.is_valid(): 
    form.save(user=request.user, commit=False) 

製作確保您的CategoryView只能由經過驗證的用戶訪問。否則,您仍然會爲用戶獲取NOT NULL約束失敗。

+0

這個工作,完美的感謝,我不得不改變這一行,雖然到'instance.user = Profile.objects.get(用戶=用戶)' – Tom

+1

是的正確的,你的命名習慣混淆:) PS你也可以只是' instance.user = user.profile' –

+0

這是非常可怕的,任何意見,我可以學習更好的命名conevntions? – Tom

相關問題