2017-07-07 11 views
0

私は2つのリンクされたモデルがあります:クラスベースの詳細ビューからインスタンスを取得して返すにはどうすればよいですか?

class MyUser(AbstractBaseUser, PermissionsMixin): 
    username = models.CharField(max_length=24, unique=True) 
    profile_page = models.OneToOneField(Profile, null=True) 

class Profile(models.Model): 
    user = models.OneToOneField(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, null=True, blank=True) 

私はこのCBVにおける単一のユーザーのプロファイルのインスタンスを取得して返そうとしています:

class ProfileView(DetailView): 
    queryset = Profile.objects.all() 
    template_name = 'profile_detail.html' 

    def get_object(self, *args, **kwargs): 
     user_profile = self.kwargs.get('username') 
     obj = get_object_or_404(Profile, user=user_profile) 
     return obj 

get_object_or_404呼び出しは次の例外が発生します。invalid literal for int() with base 10: 'adam'
ページURLをリクエストしているため「adam」http://127.0.0.1:8000/profile/adam

ここは私のURLパターンです:

urlpatterns = [ 
    url(r'^edit/', profile_edit, name='profile_edit'), 
    url(r'^(?P<username>[\[email protected]+-]+)$', ProfileView.as_view(), name='profile'), 
] 

(念のために:これらも/名前空間/プロファイルに属している)

私はProfileモデル内のモデルのフィールドにアクセスしようとしています。 return objのprofile_detail.htmlテンプレートにエラーが発生するのはなぜですか?

は、私が試した何を:私は/プロフィール/ 1のURLをIDまたはその代わり<username>のPKを受け入れ、アクセスするためのURLの正規表現を変更した場合
は、私が受け取る:TypeError at /profile/1 __str__ returned non-string (type MyUser)。その後、エラーが明らか

def get_object(self, *args, **kwargs): 
    user_profile = self.kwargs.get('id') 
    obj = get_object_or_404(Profile, user=user_profile) 
    objj = obj.user 
    return objj 

と私はやや物事がprofile_detail.htmlページに表示するために取得することができます:私はその後、私のコードがあることを更新した場合。しかし、{{object}}はMyUserモデルを指し、私が望むようなProfileモデルは参照しません。
何が起こっている可能性がありますか?それは何かを持っていますか?

def __str__(self): 
    return self.username 

モデルでは何ですか?

編集:私のプロフィールモデルの文字列方法:

def __str__(self): 
    return self.user 
+0

これは、MyUserの '__str__'メソッドのようです。プロフィールに表示する必要があります。 –

+0

@DanielRosemanが編集で追加されました。 – Homer

+0

もう一度、エラーについては不明な点がありますか? 'user'オブジェクトは、期待通りの文字列ではなく、strメソッドから明示的に返されています。 –

答えて

2

URLでusername、いないユーザーIDを含めています。

__str__ returned non-string (type MyUser)が示唆エラーメッセージとして
self.kwargs.get('username') 
obj = get_object_or_404(Profile, user__username=user_profile) 

は、あなたのProfile.__str__方法は、例えば、文字列を返すべきである:

def __str__(self): 
    return self.user.username 

最後に、あなたが持っているように見えるので、あなたは、次のようにget_object_or_404行を変更する必要があります2つのOneToOneFields,MyUser.profile_pageおよびProfile.user。これは不要です。 MyUser.profile_pageフィールドを削除した場合は、MyUserからProfileまでProfile.userの後ろに続き、user.profileの関係に従うことができます。