0

我在模板中引用了一些擴展用戶模型(UserProfile)的問題。在Django中引用擴展manytomany用戶模型...?

我設置的是當前登錄的用戶將是與該評論關聯的「用戶對象」。我已經做到了這一點,如下所示:

admin.py:

class CommentAdmin(admin.ModelAdmin): 
    list_display = ('created_by', 'post', 'created', 'active') 
    list_filter = ('active', 'created') 
    search_fields = ('created_by', 'body') 

    def save_model(self, request, obj, form, change): 
     instance = form.save(commit=False) 
     if not hasattr(instance,'created_by'): 
      instance.created_by = request.user 
     instance.save() 
     form.save_m2m() 
     return instance 

    def save_formset(self, request, form, formset, change): 

     def set_user(instance): 
      if not instance.created_by: 
       instance.created_by = request.user 
      instance.save() 

     if formset.model == Comment: 
      instances = formset.save(commit=False) 
      map(set_user, instances) 
      formset.save_m2m() 
      return instances 
     else: 
      return formset.save() 

我的評價模型如下:

class Comment(models.Model): 
    created_by = models.OneToOneField(User, related_name='created_by', null=True, blank=True) 
    post = models.ForeignKey(Post, related_name='comments') 
    body = models.TextField() 
    created = models.DateTimeField(auto_now_add=True) 
    active = models.BooleanField(default=True) 

    class Meta: 
     ordering = ('created',) 

    def __str__(self): 
     return "Comment by {} on {}".format(self.created_by, self.post) 

我的用戶配置模型擴展用戶模型如下:

class UserProfile(models.Model): 
    user = models.OneToOneField(User, related_name='userprofile') 
    user_avatar = models.ImageField(storage=site_media_upload_location, null=True, blank=True) 

一切正常。我可以保存評論並將所有評論關聯到登錄的用戶實例。我現在遇到的問題是:我想爲與每個評論相關的用戶(而不是當前登錄的用戶)顯示user_avatar(在UserProfile模型中定義)。

到目前爲止,我已經試過如下:

<img src="{{ MEDIA_URL }}{{ comment.created_by.user.userprofile.user_avatar.url }}"> 

<img src="{{ MEDIA_URL }}{{ comment.created_by.userprofile.user_avatar.url }}"> 

但似乎沒有任何工作(最後的猜測更多的是比實際現實的可能性絕望的咂嘴)。

因此,從上述模型 - 以及有關當前記錄的用戶對象的實例創建的評論的知識 - 我如何得到這一切工作?

我唯一的其他想法是,我可能需要在像這樣添加到評論模式:

class Comment(models.Model): 
    commenter_avatar = models.OneToOneField(UserProfile.user_avatar, related_name='user_avatar', null=True, blank=True) 

也許我也許可以要求user.userprofile.user_avatar在評論管理save()方法?

回答

1

已經是像場的url財產增加了MEDIA_URL,看到https://docs.djangoproject.com/en/1.11/topics/files/#using-files-in-models

所以最終的標籤應該是:

<img src="{{ comment.created_by.userprofile.user_avatar.url }}"> 

提供的用戶配置文件實際上有一個圖像

+0

真棒 - 這工作!我不確定這是爲什麼 - 我保存評論時使用了User實例。所以當然我需要說:「找到評論,找到它是誰的created_by(這是一個用戶)...所以進入該用戶,並找到他們的用戶配置文件,然後找到他們的user_avatar.url ...除非created_by和用戶和排序(它們是否是相同的?) –

+0

您引用了created_by中的User對象,每個User對象都通過userprofile相關屬性擁有UserProfile的外鍵,然後在該模板中,ORM只是遵循對用戶的引用,然後是用戶配置文件,然後是圖像 – SebCorbin

+0

所以用戶和created_by是相同的(OneToOneField)之一,然後我們可以從任何一個跳轉到UserProfile。有點合理。你認爲最好覆蓋默認的Django用戶模型嗎?我讀了一些說是的,有些人說不......因爲,Django的重點不在於重新發明輪子。 –

1
class UserProfile(models.Model): 
    user = models.OneToOneField(User, related_name='userprofile') 
    user_avatar = models.ImageField(upload_to="images/") // no need null=True, blank=True 

class Comment(models.Model): 
    created_by = models.ForeignKey(UserProfile, related_name='created_by', null=True, blank=True) 
    post = models.ForeignKey(Post, related_name='comments') 
    body = models.TextField() 
    created = models.DateTimeField(auto_now_add=True) 
    active = models.BooleanField(default=True) 

    class Meta: 
     ordering = ('created',) 

    def __str__(self): 
     return "Comment by {} on {}".format(self.created_by, self.post) 


<img src="{{ MEDIA_URL }}{{ comment.created_by.user_avatar.url }}"> 

我想你使用太多的USER關係來簡化你的代碼。 試試吧!

+0

是的 - 這非常純粹,可以將評論模型鏈接到「擴展用戶」UserProfile模型 - 但是,我需要更深入的代碼擴展到用戶模型anwyay - 例如,在{{comment.created}}上評論{{comment.created_by.user.username}}' –