私は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
これは、MyUserの '__str__'メソッドのようです。プロフィールに表示する必要があります。 –
@DanielRosemanが編集で追加されました。 – Homer
もう一度、エラーについては不明な点がありますか? 'user'オブジェクトは、期待通りの文字列ではなく、strメソッドから明示的に返されています。 –