2012-07-19 47 views
1

我試圖在管理員中覆蓋save()方法,因此當我的發佈者用戶創建他們的客戶用戶時,發佈者字段會自動分配當前用戶的值。Django:爲外鍵對象分配當前用戶的值

ValueError: Cannot assign "User: foo": "SimpleSubscriber.publisher" must be a "Publisher" instance. 

我用這個教程開始:here.

def save_model(self, request, obj, form, change): 
    if not change: 
     obj.publisher = request.user 
    obj.save() 

這是保存方法重寫。誰可以訪問管理員的用戶只能是出版商,都發布和SimpleSubscriber模型是用戶模型:

class Publisher(User): 
    def __unicode__(self): 
     return self.get_full_name() 

class SimpleSubscriber(User): 
    publisher = models.ForeignKey(Publisher) 
    address = models.CharField(max_length=200) 
    city = models.CharField(max_length=100) 
    state = USStateField() 
    zipcode = models.CharField(max_length=9) 
    phone = models.CharField(max_length=10) 
    date_created = models.DateField(null=True) 
    sub_type = models.ForeignKey(Product) 
    sub_startdate = models.DateField() 
    def __unicode__(self): 
     return self.last_name 

我能,以便分配給每個新SimpleSubscriber當前的發佈者用戶更換request.user

回答

1

您必須將request.user替換爲Publisher的實例。要做到這一點

一種方法是:

Publisher.objects.get(**{Publisher._meta.get_ancestor_link(User).name: request.user}) 

當然,這會在您每次調用它的時間進行查找,所以你可能想設計應用程序做這在每次請求。另一種方法是(輕微地)濫用django模型系統 - 其中一個模型從另一個模型繼承,相應的父模型和子模型實例具有相同的id(默認情況下);

Publisher.objects.get(id = request.user.id) 
+0

第二個建議奏效。第一個返回錯誤,說'用戶'沒有定義。但是我對第一個建議非常好奇,因爲我沒有完全理解**的目的,也找不到任何關於_meta的文檔。我在哪裏可以瞭解更多關於訪問這些元信息並使用它的信息? – 2012-07-20 15:59:35

+0

第一個只會有你描述的錯誤,因爲你沒有首先導入'User'。存在'**'語法來展開字典以提供關鍵字參數:http://docs.python.org/reference/expressions.html#calls; '_meta'是django內部的一部分,參見https://docs.djangoproject.com/en/dev/internals/,你也可以查看源代碼,並使用'dir'探索內容(查看標準庫參考)。 – Marcin 2012-07-20 17:51:18

+0

感謝您的鏈接 – 2012-07-24 19:13:28