2012-09-25 8 views
0

사용자와 연결된 이미지를 올바르게 표시하려고합니다. 템플릿에 무엇이 포함되어야하는지 결정하는 데 도움이 필요합니다. 특히 "{{review.user__image}"템플릿의 코드가 잘못되었다고 생각합니다. 특정 리뷰와 해당 리뷰를 작성한 사용자를 기반으로 사용자와 연결된 이미지를 가져 오는 방법은 무엇입니까?템플릿의 사용자와 연결된 속성을 가져올 수 있습니까?

views.py의

def view_reviews(request, product_name): 
    product = get_object_or_404(Productbackup, url_friendly=product_name) 
    product_id = product.id 
    reviews = Reviewbackup.objects.filter(product_id=product_id).order_by("-created_on") 
    return render_to_response('reserve/templates/view_reviews.html', {'reviews':reviews}, 
     context_instance=RequestContext(request)) 

models.py

class Reviewbackup(models.Model): 
    review = models.CharField('Review', max_length = 2000) 
    user = models.CharField('Username', max_length = 200) 
    rating = models.IntegerField(max_length=2, choices=RATING_OPTIONS) 
    product = models.ForeignKey(Productbackup) 
    def __unicode__(self): 
     return self.review 

class UserProfile(models.Model): 
    user = models.ForeignKey(User, primary_key=True) 
    image = models.ImageField(blank=True, null=True, max_length=255, upload_to="images/") 

템플릿

{% for review in reviews %} 
    <br><a href = "/user/{{review.user}}/">{{review.user}}</a><br> 
    <img class = "thumbnail" src = "http://test.webfactional.com/static/{{review.user__image}}"><br> 
    {{review}} 
{% endfor %} 

답변

1

죄송합니다. 귀하의 코드로 판단 해 보니 장고를 처음 사용하는 사람이라고 가정합니다. 따라서이 답변은 프로세스 대답 질문뿐만 아니라 유익한 정보가 될 것입니다. 리뷰 모델에서

사용자, user 대신 CharFieldForeignKey해야한다. 나는 네임드를 저장하는 것이 더 자연 스럽다는 것을 이해한다. 특히 데이터베이스 테이블을 직접 보게된다면, 그 접근법은 오류가 발생하기 쉽고, 아주 좋은 이유가 없다면, 나쁜 일을해야한다.

사용자 이름이 foousername 인 경우를 상상해보십시오. 그런 다음 해당 사용자가 몇 개의 리뷰를 만듭니다. 따라서이 시점에서 user 필드가 foousername이되는 몇 가지 리뷰를 갖게됩니다. 이제 사용자가 자신의 사용자 이름을 someotherfoousername으로 변경하려는 경우 리뷰와 사용자 간의 연결을 끊지 않으려면 사용자가 새 사용자 이름을 사용하기 위해 만든 모든 리뷰에 대해 user 필드를 변경해야합니다. 이것은 잊어 버릴 수있는 추가 단계이므로 오류가 발생하기 쉽습니다. ForeignKey을 사용하면이 문제가 즉시 해결됩니다. 사용자가 사용자 이름을 변경하더라도 사용자의 기본 ID는 변경되지 않으므로 리뷰가 기본 키 (외래 키가 무엇인지)에 연결되면 리뷰를 업데이트 할 필요가 없습니다. 따라서 작업량이 적고 안정적인 방법입니다.

그래서 (다음 related_name를 설명합니다)이 작업을 수행 :

user = models.ForeignKey(User, related_name='reviews') 

related_name

당신이 related_name를 사용하고, 장고는 당신의 인생을 만들어 더 쉽게.

보기. 먼저 제품을 조회합니다. 그런 다음 얻은 정보를 ID로 가져온 다음 해당 제품의 모든 리뷰를 반환하는 쿼리를 작성합니다. Django를 사용하면 훨씬 적은 코드를 사용하여 모든 작업을 수행 할 수 있습니다.

product = get_object_or_404(Productbackup, url_friendly=product_name) 
reviews = product.reviewbackup_set.all() 

그러나 이것은 전체 _set 사업 때문에 다소 혼란 스럽습니다. related name가 들어오는 곳이다 다음과 같이 당신이 당신의 product 필드를 정의 경우.

product = models.ForeignKey(Productbackup, related_name='reviews') 

는 다음 조금 더 읽을 수있는 방법을 같은 작업을 수행 할 수 있습니다 (파이썬 읽을 수 있어야 ...) :

reviews = product.reviews.all() 

사용자 프로필

외래 키는 일대 다 관계를 구현할 수 있습니다. 그래서 제품과 리뷰를 위해 그것은 완벽하게 이해됩니다. 하나의 제품은 많은 리뷰를 가질 수 있습니다. 그러나 일반적으로 이는 사용자 프로필에 해당하지 않습니다. 일반적으로 사용자에게는 하나의 사용자 프로필 만 있습니다. 따라서 사용자 프로필에서, 당신과 같이 OneToOneField를 사용해야하는 대신 사용자에게 ForeignKey을 가지고 있지만 안 :

user = models.OneToOneField(User, primary_key=True, related_name='profile') 

를 쉽게 사용자의 프로필에 액세스 할 수 있도록 그 :

user_profile = User.objects.get(...).profile 

사용자의 이미지를

첫 번째 설명에 따라 사용자가 ForeignKey이므로 검토 할 때마다 매우 쉽게 사용자의 이미지에 액세스 할 수 있습니다.

프로젝트 설정에서 MEDIA_ROOT에 정의 된 한 -

이미지 URL

당신이 장고에 FileField을 사용할 때마다, 그것은 미디어 폴더 아래 upload_to 위치에 파일을 업로드합니다. 따라서 귀하의 경우 장고는 미디어 폴더 내에 images 폴더에 이미지를 저장합니다. 템플릿에서 직접 URL을 포함하는

user_profile.image.url 

하드 코딩 된 URL

아주 나쁜 생각 : 당신이 MEDIA_URL를 구성하는 경우뿐만 아니라, 그와 같은 파일의 URL에 액세스 할 수 있습니다. Thats 패턴 이름은 무엇을위한 것입니다. 그래서 아이디어는 url 패턴에 이름을 지정하는 것이므로 나중에 이름을 참조하여 URL을 얻을 수 있습니다. 따라서 코드를 훨씬 더 유지 보수 할 수 있습니다.이 허용

url(r'^user/(?P<username>\w+)/$', 'user_view', name='user_view') 

당신이 템플릿에서과 같이 사용하기 :

{% load url from future %} 
link: <a href="{% url 'user_view' username=user.username %}">{{ user.username }}</a> 

함께

# views.py 
def view_reviews(request, product_name): 
    product = get_object_or_404(Productbackup, url_friendly=product_name) 
    reviews = product.reviews.all().order_by("-created_on") 
    return render_to_response('reserve/templates/view_reviews.html', 
           {'reviews':reviews}, 
           context_instance=RequestContext(request)) 

과 최선을 다하는 예를 들어, 다음은 사용자의 URL 패턴입니다

# models.py 
class Reviewbackup(models.Model): 
    review = models.CharField('Review', max_length = 2000) 
    user = models.ForeignKey(User, related_name='reviews') 
    rating = models.IntegerField(max_length=2, choices=RATING_OPTIONS) 
    product = models.ForeignKey(Productbackup, related_name='reviews') 
    def __unicode__(self): 
     return self.review 

class UserProfile(models.Model): 
    user = models.OneToOneField(User, primary_key=True, related_name='profile') 
    image = models.ImageField(blank=True, null=True, max_length=255, upload_to="images/") 

d

{# template #} 
{% load url from future %} 
{% for review in reviews %} 
    <br><a href="{% url user_view username=review.user.username %}"> 
     {{ review.user.username }}</a><br> 
    <img class="thumbnail" src="{{ review.user.profile.image.url }}"><br> 
    {{ review.review }} 
{% endfor %} 
+0

종합적인 답변 주셔서 감사합니다! 사용자를 CharField에서 ForeignKey로 변경하면 마이그레이션을 실행할 때 오류가 발생합니다. 다음 SQL 쿼리가 실패했습니다. CREATE INDEX "reserve_reviewbackup_fbfc09f1"ON "reserve_reviewbackup"("user_id"); 오류 : index reserve_reviewbackup_fbfc09f1 이미 존재합니다 ! 실제 마이그레이션 실행 중 오류가 발생했습니다! 중단. ! 실행을 지원하지 않는 데이터베이스가 있으므로! 트랜잭션에서 스키마 변경 구문을 사용하면 ! 마이그레이션 사이의 임시 상태로 남겨 둡니다. – sharataka

+0

죄송합니다. 그것을 고치는 방법을 모른다. DB에 얼마나 많은 데이터가 있습니까? db/deployment를 개발한다면 처음부터 syncdb를 시작하여 새로운 db 스키마가 제대로 작동하는지 확인한 다음 모든 디버깅 및 버그 수정 후 이전 데이터를 마이그레이션하십시오. – miki725

-1

imageUser에 없으며, 에 있습니다.

{{ review.user.userprofile.image }} 
+0

{{review.user.userprofile.image}} 시도했지만 작동하지 않습니다. – sharataka

0

사용자 프로필을 얻는 방법을 모르는 것 같습니다. 여기가 작동하도록 사용자 프로필을 정의하는 방법에 대한 몇 가지 정보입니다 : 요컨대

https://docs.djangoproject.com/en/dev/topics/auth/#storing-additional-information-about-users

는, (당신은 UserProfile.user에게 OneToOneField을 만들 것, 그리고 당신은 user.get_profile 사용할 수있을 것). 그렇지 않으면 모델 정의를 그대로두고 UserProfile.objects.get(user=user) 또는 user.userprofile_set.all()[0] (eww)과 같은 것을 사용할 수 있습니다.

일단 UserProfile 개체가 있으면 @Ignacio가 옳습니다. 이미지가 거기에 있습니다. {{ review.user.userprofile.image }}의 문제는 사용자가 OneToOneField 대신 ForeignKey가되어 사용자 대신 userprofile_set 특성을 전달한다는 것입니다.

+0

답변 해 주셔서 감사합니다. 내가 현재 모델을 사용하는 경우 UserProfile.objects.get (user = user)를 사용할 수 있다고 언급했는데 템플릿에서이 템플릿을 사용할 수 있다고 생각하지 않습니까? 개별 사용자를 선택하지 않습니다. 여러 개의 리뷰를 선택한 다음 각 리뷰에 대한 사용자를 얻습니다. 예를 들어 {{review.user}}는 템플릿에 넣을 때 잘 작동합니다. {{review.user.userprofile.image}}가 아닌 이유는 무엇입니까? OneToOne과 함께 작동하지만 ForeignKey가 아닌 이유는 무엇입니까? – sharataka

+0

관계가 OneToOne로 정의 된 경우, 사용자는 역 관계에 대해 단일 userprofile 속성을 갖습니다. 그것은 ForeignKey이기 때문에 (많은 프로파일들이 같은 User를 가리킬 수있다), 당신은 queryset을 산출하는'userprofile_set' 속성을 얻는다. – dokkaebi

+0

사용자 프로필에 'userprofile' 속성이 없으면 {{review.user.userprofile}}, {{review.user.userprofile.image}} 및 {{review.user.userprofile.whatever_else}} 모두 결과가' . 장고 템플릿은 그 점에서 잘못을 용인합니다. – dokkaebi

관련 문제