我在模板中引用了一些擴展用戶模型(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()方法?
真棒 - 這工作!我不確定這是爲什麼 - 我保存評論時使用了User實例。所以當然我需要說:「找到評論,找到它是誰的created_by(這是一個用戶)...所以進入該用戶,並找到他們的用戶配置文件,然後找到他們的user_avatar.url ...除非created_by和用戶和排序(它們是否是相同的?) –
您引用了created_by中的User對象,每個User對象都通過userprofile相關屬性擁有UserProfile的外鍵,然後在該模板中,ORM只是遵循對用戶的引用,然後是用戶配置文件,然後是圖像 – SebCorbin
所以用戶和created_by是相同的(OneToOneField)之一,然後我們可以從任何一個跳轉到UserProfile。有點合理。你認爲最好覆蓋默認的Django用戶模型嗎?我讀了一些說是的,有些人說不......因爲,Django的重點不在於重新發明輪子。 –