2016-02-08 298 views
1

我試圖將表單數據保存到匿名用戶,但是當我嘗試在CreateView中保存某些表單數據時出現以下錯誤。「我不清楚問題是什麼?匿名用戶錯誤

ValueError: Cannot assign "<SimpleLazyObject: <django.contrib.auth.models.AnonymousUser object at 0x11126bc18>>": "EUser.user" must be a "User" instance. 

型號:

class EUser(models.Model): 
    online_account = models.BooleanField() 

    supplier1 = models.OneToOneField(SupplierAccount) 
    supplier2 = models.OneToOneField(SupplierAccount) 
    supplier3 = models.OneToOneField(SupplierAccount) 

    address = models.OneToOneField(Address) 
    user = models.ForeignKey(settings.AUTH_USER_MODEL) 

class SupplierAccount(models.Model): 
    supplier = models.ForeignKey(Supplier) 
    username = models.CharField(max_length=255) 
    password = models.CharField(max_length=255) 

形式:

class ServiceTypeForm(forms.ModelForm): 
    # BOOL_CHOICES = ((False, 'No'), (True, 'Yes')) 

    # online_account = forms.BooleanField(widget=forms.RadioSelect(choices=BOOL_CHOICES)) 

    def __init__(self, *args, **kwargs): 
     super(ServiceTypeForm, self).__init__(*args, **kwargs) 
     self.fields['service_type'].initial = 'D' 

    class Meta: 
     model = EUser 
     fields = ('service_type', 'online_account') 

查看:

class ServiceTypeView(CreateView): 
    form_class = ServiceTypeForm 
    template_name = "standard_form.html" 
    success_url = '/' 

    def form_valid(self, form): 
     form.instance.user = self.request.user 
     super().form_valid(form) 
     online_account = form.cleaned_data['online_account'] 
     if online_account: 
      return redirect('../online') 
     else: 
      return redirect('../address') 

回答

3

如果用戶未登錄,則request.user是匿名用戶。將匿名用戶分配給form.instance.user是沒有意義的,因爲數據庫中不存在匿名用戶或具有主鍵。

如何更改代碼取決於您希望應用程序的工作方式。

如果你想允許匿名用戶創建的服務類型,然後

if self.request.user.is_authenticated(): 
    form.instance.user = self.request.user 

對於這個工作,你需要改變用戶領域,使之選。

user = models.ForeignKey(settings.AUTH_USER_MODEL, blank=True, null=True) 

進行此更改後,你需要運行makemigrations然後migrate,更新數據庫。

另一種選擇是將視圖限制爲登錄用戶。在Django 1.9+中,您可以使用LoginRequiredMixin執行此操作。

from django.contrib.auth.mixins import LoginRequiredMixin 

class ServiceTypeView(LoginRequiredMixin, CreateView): 
    ... 
+0

我在嘗試將表單數據臨時保存到匿名用戶。有幾頁我想用匿名用戶保存到數據庫中。通過這種方式,網站的新用戶可以瀏覽前幾個表單 - 檢查我們的服務,如果他們決定之後不註冊,我可以從數據庫轉儲數據(或將其附加到會話ID)。我不想強迫用戶首先註冊。我認爲會話ID本質上是作爲匿名用戶保存到數據庫的?匿名用戶是否=會話ID – Yunti

+0

匿名用戶沒有主鍵或任何持久性。您不能通過會話密鑰或任何其他標識符來識別它。如果要存儲會話ID,則必須爲模型添加額外的字段,然後確保用戶字段在用戶註冊時填充。另一種方法可以是自動創建用戶,但在用戶註冊之前不要將其設置爲活動狀態。這有其自身的問題(例如,您將非活動用戶的電子郵件地址和用戶名設置爲什麼?)。 – Alasdair

+0

好吧,我認爲這是我的困惑。我認爲匿名用戶本質上是會話ID,並且如果用戶未登錄匿名用戶,則由會話ID標識。什麼是用戶ajtl? – Yunti

0

我認爲你不能使用AnonymousUser作爲值一個ForeignKey給用戶。

在這種情況下,您應該保持爲Null。

class EUser(models.Model): 
    ... 
    user = models.ForeignKey(settings.AUTH_USER_MODEL, null=True, default=None) 


class ServiceTypeView(CreateView): 
    ... 

    def form_valid(self, form): 
     if self.request.user.is_authenticated(): 
      form.instance.user = self.request.user 
     ...