пользовательские шаблоны URL в Django - PullRequest
0 голосов
/ 08 февраля 2019

У меня есть веб-сайт, который я пытаюсь создать для личного использования, и у него есть два идентификатора: один для встречи (где проходит гонка) и один для мероприятия (номер гонки).Идентификатор события имеет вид «123456_01» и передается в модели в качестве первичного ключа для модели события, как показано ниже ...

class Event(models.Model):
    meeting = models.CharField(max_length=500)
    meetingID = models.ForeignKey(Meeting, on_delete='CASCADE', related_name='races')
    eventID = models.CharField(max_length=300, primary_key=True)
    venue = models.CharField(max_length=600, null=True)
    race_no = models.CharField(max_length=2)
    event_time = models.TimeField()
    status = models.CharField(max_length=100)
    distance = models.CharField(max_length=600)

В настоящее время файл представлений настроен какследует:

class EventDetailView(DetailView,LoginRequiredMixin):
    context_object_name = 'race_detail'
    template_name = 'event.html'
    model = models.Event
    slug_url_kwarg = 'eventID'

У меня также настроен внешний интерфейс, так что в настоящее время, когда я нажимаю на определенную расу, он автоматически переходит на страницу со ссылкой http://127.0.0.1:8000/app/123456_01/,, так что частьработая с этим конфигом в HTML:

{% url 'bettingUI:race' eventID=events.eventID %}

проблема, с которой я, похоже, сталкиваюсь, связана с конфигурацией файла urls.py и, возможно, чего-то, чего мне не хватает в файле views.py.

мой файл urls.py настроен следующим образом:

from django.urls import path, include
from . import views

app_name = 'bettingUI'

urlpatterns = [
    path('',views.DashListView.as_view(),name='dashboard'),
    path('<eventID>/', views.EventDetailView.as_view(), name='race'),   

]

При чтении документов я подумал, что мне нужно использовать слаг из-за символа '_' в идентификаторе, который я передаюно я постоянно получаю сообщение об ошибке в браузере, утверждающее, что он не может разрешить ключевое слово "slug" в поле.Возможные варианты: dro_eventID, dro_meetingID, dro_meetingID_id, event_time, собрание, race_no, участники, статус, место проведения (** поля модели).Если я изменю файл urls.py на приведенный ниже, я получу ту же ошибку:

   path('<slug:eventID>/', views.EventDetailView.as_view(), name='race'),

Я немного растерялся, поэтому хотел бы получить рекомендации.

Спасибо.


Я сработал, ответ - ввести <slug:pk>

, но теперь я получаю сообщение об ошибке на своей информационной панели (страница, на которую я попадаю, чтобы перейти на страницу гонки):

NoReverseMatch at /app/
Reverse for 'race' with keyword arguments '{'eventID': '1216859_01'}' not found. 1 pattern(s) tried: ['app/(?P<pk>[-a-zA-Z0-9_]+)/$']

Ответы [ 2 ]

0 голосов
/ 09 февраля 2019

Я думаю, что нашел решение здесь, попробуйте это:

url.py:

 path('<slug:eventID>/', views.EventDetailView.as_view(), name='race')

Теперь вы можете просто получить экземпляр Event в вашем EventDetailView общем видеиспользуя get_object метод, подобный этому:

class EventDetailView(DetailView, LoginRequiredMixin):
     context_object_name = 'race_detail'
     template_name = 'event.html'
     model = models.Event

     def get_object(self):          
         e1 = Event.objects.get(eventID=self.kwargs['eventID'])
         print (e1.eventID) # or e1.pk gives: 123456_01
         return e1

Вы также можете изменить eventID с CharField на SlugField.И все еще это работает.

0 голосов
/ 09 февраля 2019

Итак, я снова даю рабочую версию:

Сначала вы должны добавить поле slug в вашу модель событий, и это позволит вам использовать слаг, так что ваша модель будет выглядеть так:

from django.utils.text import slugify

class Event(models.Model):
    meeting = models.CharField(max_length=500)
    meetingID = models.ForeignKey(Meeting, on_delete='CASCADE', related_name='races')
    eventID = models.CharField(max_length=300, primary_key=True)
    venue = models.CharField(max_length=600, null=True)
    race_no = models.CharField(max_length=2)
    event_time = models.TimeField(null=True)
    status = models.CharField(max_length=100, null=True)
    distance = models.CharField(max_length=600, null=True)
    slug = models.SlugField(max_length=50, null=True)

    def save(self, *args, **kwargs):
        self.slug = slugify(self.eventID, allow_unicode=True)
        return super(Event, self).save(*args, **kwargs)

Обратите внимание на функцию save(), и в нее мы добавили метод slugify () для slugify поля eventID при сохранении события.

Затем ваши представления должно выглядеть следующим образом:

from .models import Event, Meeting

class EventList(ListView):
    model = Event
    template_name = 'event_list.html'
    context_object_name = 'race_list'    

class EventDetailView(DetailView,LoginRequiredMixin):
    context_object_name = 'race_detail'
    template_name = 'myusers1/event.html' # this could be only event.html if the template is in yourapp/templates/ folder directly
    model = Event
    slug_url_kwarg = 'slug'

Обратите внимание, что в представлении выше мы теперь используем определение по умолчанию определение.

Я поместил URL списка подraces/ под-URL, но вы можете разместить его где угодно.И в вашем urls.py теперь вы можете правильно использовать значения slug, например:

path('races/<slug:slug>/', views.EventDetailView.as_view(), name='race'),
path('races/', views.EventList.as_view(), name='race_list'),

В моем пробном приложении шаблоны выглядят следующим образом: шаблон списка:

{% extends 'myusers1/base.html' %}

{% block content %}

<div class"container">
  <div class="col col-lg-2">
    <h2>Races</h2>
        <ul>
            {% for race in race_list %}
                <div class="col-xs-12 .col-md-8"><li><a href="{% url 'Myusers1:race' slug=race.slug %}"> {{ race.venue }} </a> </li></div>
            {% endfor %}
        </ul>
  </div>
</div>

{% endblock %}

И шаблон детализации выглядит следующим образом:

{% extends 'myusers1/base.html' %}

{% block content %}

<div class"container">
  <div class="col col-lg-2">

    <h2>Race Details</h2>

            <div class="col-xs-12 .col-md-8"> <h4>Venue name: </h4> {{ race_detail.venue}} </div>
            <div class="col-xs-12 .col-md-8"> <h4>Event ID: </h4> {{ race_detail.eventID }} </div>
            <div class="col-xs-12 .col-md-8"> <h4>Meeting name: </h4> {{ race_detail.meeting }} </div>
            <div class="col-xs-12 .col-md-8"> <h4>Meeting ID: </h4> {{ race_detail.meetingID.id }} </div>

  </div>
</div>

{% endblock %}

И визуальный результат о том, как работают динамические URL, используя приведенное выше:

enter image description here

Я надеюсь, что вышеупомянутое поможет вам завершить список приложений и просмотреть подробности прямо сейчас.Приветствия.

...