DjangoでWebアプリを開発しています。
やりたいこと
ユーザー一覧を表示したいです。
ユーザー一覧には、ユーザー詳細ページに飛ぶためのリンクがあります。
ユーザーIDを使ってurlを作る場合はうまくいったのですが、ユーザーのニックネームを使ってurlを作りたいと考えています。
以下のviews.pyのUserDetailViewにおいて、
slug_url_kwarg = "nick_name"
としています。
ニックネームが入力されているユーザーのUserDetailViewがうまく動いていることは確認しています。
問題点
しかし、ニックネームをまだ作っていないユーザーもいます。
そのため、そのユーザーの詳細ページに飛ぶためのurlが作れないです。
ユーザー一覧を表示しようとすると、
Reverse for 'user_detail' with arguments '('',)' not found. 1 pattern(s) tried: ['user/detail/(?P<nick_name>[^/]+)$']
というエラーが出ます。
考えたこと
・ニックネームをdefaultでanonymousとする。→nick_nameはuniqueとしているので、できない。
・テンプレートで{% if user.nick_name %}{% endif % }で囲っても、上記エラーは出る。
どうしたら、良いか困っております。
お分かりの方、よろしくお願い致します。
関連するコード
以下、関連するコードを記載します。
python
1# views.py 2 3# ユーザー一覧を表示するview 4class UserListView(ListView): 5 6 model = CustomUser 7 paginate_by = 100 8 9 def get_context_data(self, **kwargs): 10 context = super().get_context_data(**kwargs) 11 context['now'] = timezone.now() 12 return context 13 14# ユーザーの詳細ページを表示するview 15class UserDetailView(DetailView): 16 17 model = CustomUser 18 19 slug_field = "nick_name" 20 slug_url_kwarg = "nick_name" 21 lang = get_language() 22 def get_context_data(self, **kwargs): 23 context = super().get_context_data(**kwargs) 24 return context 25
python
1# urls.py 2urlpatterns = [ 3 path('detail/<nick_name>', UserDetailView.as_view(), name='user_detail'), # ニックネームを作っていないユーザーがいるため、このurlが作れない。 4 path('', UserListView.as_view(), name='user_list'), 5]
html
1<!--customuser_list.html--> 2<!--ユーザー一覧を表示するtemplate--> 3{% block title %}user list{% endblock %} 4{% block content %} 5 <ul class="list-group list-group-flush"> 6 {% for user in object_list %} 7 <li class="list-group-item"> 8 <div class="row"> 9 <div class="col col-md-3"> 10 <a href="{% url 'user:user_detail' user.nick_name %}">{{ user.nick_name }}</a> 11 </div> 12 </div> 13 </li> 14 {% endfor %} 15 </ul> 16{% endblock %}
python
1# models.py 2# ユーザー情報のmodel 3class CustomUser(AbstractUser): 4 class Meta(AbstractUser.Meta): 5 db_table = 'custom_user' 6 7 nick_name = models.CharField(max_length=100, unique=True)
以上、よろしくお願い致します。
回答1件
あなたの回答
tips
プレビュー