coltonOP
@coltonOP (こるとんくん)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

[Django]DetailViewで404になる

解決したいこと

DjangoでWebアプリを作成しているのですが、DetailViewで詳細画面を表示しようとすると404になってしまいます。

どうやら 00001 にあたるレコード は データベースにないよ と言われているんだろうと思うのですが、
実際にあるんです。 自分は pk のレコードを文字列型(CharField)にしてるのですが、それがだめなのでしょうか?

よろしくお願いいたします。

発生している問題・エラー


Page not found (404)
Using the URLconf defined in , Django tried these URL patterns, in this order: scheduleweb.urls

admin/
[name='login']
home/ [name='home']
sakusei/ [name='sakusei']
signup/ [name='signup']
user/ [name='user']
hensin/<int:pk> [name='hensin']
The current path, , matched the last one. hensin/00001

urls.py

from django.urls import path
from . import views

app_name="account"

urlpatterns = [
    
    path("", views.LoginView.as_view(), name="login"),
    
    path("home/", views.HomeView.as_view(), name="home"),
    
    path("sakusei/", views.MendanSakuseiView.as_view(), name="sakusei"),
    
    path("signup/", views.SignUpView.as_view(), name="signup"),
    
    path("user/", views.UserView.as_view(), name="user"),
    
    path("hensin/<int:pk>", views.MendanHensinView.as_view(), name="hensin"),
    
    ]

models.py

class MendanMaster(models.Model):
    
    code_m = models.CharField(max_length=5, primary_key=True)
    name_m = models.CharField(verbose_name= '面談名', max_length=16)
    time_m = models.IntegerField(verbose_name= '面談時間',  choices=MENDAN_TIME, default=0)
    type_m = models.IntegerField(verbose_name= '面談タイプ', validators=[MinValueValidator(0),MaxValueValidator(1)], choices=MENDAN_TYPE, default=None)
    place_m = models.IntegerField(verbose_name= '面談場所', choices=MENDAN_STATE, default=None)
    state_m = models.IntegerField()
    create_m = models.DateField(auto_now_add=True)
    deadline_m = models.DateField(verbose_name= '締め切り日',)
    start_m = models.DateField(verbose_name= '開始日',)
    end_m = models.DateField(verbose_name= '終了日',)    
    yusen1_m = models.DateField(verbose_name= '1番優先日',)
    yusen2_m = models.DateField(verbose_name= '2番優先日',)
    yusen3_m = models.DateField(verbose_name= '3番優先日',)
    yusen4_m = models.DateField(verbose_name= '4番優先日',)
    yusen5_m = models.DateField(verbose_name= '5番優先日',)
    
    def __str__(self):
        
        return (self.code_m) + (self.name_m)

views.py

class HomeView(LoginRequiredMixin, ListView):
        
    template_name = "account/Yakuinhome.html"
    
    model = MendanMaster
    
    context_object_name = "mendan_list"
    
    def get_template_names(self):
        
        if self.request.user.yakusyoku_s == 0:
            template_name = "account/Yakuinhome.html"
        else:
            template_name = "account/Syainhome.html"
            
        return [template_name]


class MendanHensinView(DetailView):
    
    template_name = 'account/SyainHensin.html'
    
    model = MendanMaster

Syainhome.html + SyainHensin.html

抜粋
***home.html***
{% for MI in mendan_list %}
            <p class="pk">
                <a class="pp1" href="{% url 'account:hensin' MI.pk %}" >{{ MI.name_m }}</a>
                <a class="pp3">{% if MI.place_m == 0 %}
                                    Zoom
                               {% elif MI.place_m == 1 %}
                                   本社
                               {% elif MI.place_m == 2 %}
                                   HONDA社
                               {% endif %}</a>
                <a class="pp4">{{ MI.deadline_m|date:"n/j:(D)" }}</a>
                <a class="pp5">{{ MI.start_m|date:"n/j:(D)" }}~{{ MI.end_m|date:"n/j:(D)" }}</a>
                <a class="pp6">~~~%</a>
                <a class="pp7">{% if MI.state_m == 0 %}
                                    受付中
                               {% elif MI.state_m == 1 %}
                                   決定済
                               {% endif %}</a>
            </p>
            {% endfor %}


***hensin.html***

{% extends "account/base2.html" %}

{% block content %}
    <header>
        <h1>
            <a href=""> スケジュールアプリ</a>
        </h1>
        
        <nav calss="nav">
            <ul>
                <li><a href="">ログアウト</a></li>
            </ul>
        </nav>
    </header>

    <form method="post" class="mother">
       
        <div class="menu1">
            <div class="demo">
            </div>
            <div>
                
                <div class="p2">
                    
                    {{ MI.name_m }}
                </div>
                <div class="p1">
                    
                    <a>{{ MI.time_m }}</a>
                </div>
                
               
            </div>
            
        </div>
        
        <div class="ichiran">
            
        </div>
    

    
  
    
    
    </form>
    
    

{% endblock %}


0

1Answer

path("hensin/<int:pk>", views.MendanHensinView.as_view(), name="hensin")

ここで <int:pk> と書くとマッチした値が int に変換されるため、たとえば文字列 00001 は整数 1 になり、キーとして一致しなくなります。 <int:pk> ではなく正規表現でマッチするとよさそうです:

# from django.urls import re_path が必要
re_path(r"^hensin/(?P<pk>\d+)$", views.MendanHensinView.as_view(), name="hensin")
1Like

Comments

  1. @coltonOP

    Questioner

    確かにint型ではないと思い、<int:pk>を<slug:pk>にしたら、きちんと値も表示されました! ありがとうございます。 数値ならint 英数文字ならslug 全角文字列を含めたものはstrらしいです。 ありがとうございました!

Your answer might help someone💌