Как работает сопоставление URL шаблона django - PullRequest
0 голосов
/ 30 октября 2019

Я пытаюсь выяснить, как работает сопоставление URL в шаблоне django. То, чего я пытаюсь добиться, это то, что при нажатии на ссылку появляются конкретные объекты.

Models.py

class PostManager(models.Manager):
    def get_queryset(self):
        return super(PostManager,self).get_queryset().filter(status='published')

class Post(models.Model):
    STATUS_CHOICES = (('published','Published'),
                        ('draft','Draft '))
    FIELD_CHOICES = (('1','1 Title and body field'),
                    ('2','2 Title and body fields'),
                    ('3','3 Title and body fields'),
                    ('4', '4 Title and body fields'),
                    ('5', '5 Title and body fields'))

    author = models.ForeignKey(User,
                                on_delete=models.CASCADE,
                                related_name='blog_post')


    title = models.CharField(max_length=100)
    sub_title = models.TextField(max_length=50,default="")

    title_1 = models.CharField(max_length=100,null=True,blank=True)
    title_1_body = models.TextField(null=True,blank=True)


    title_2 = models.CharField(max_length=100,null=True,blank=True)
    title_2_body = models.TextField(null=True,blank=True)


    title_3 = models.CharField(max_length=100,null=True,blank=True)
    title_3_body = models.TextField(null=True,blank=True)



    title_4 = models.CharField(max_length=100,null=True,blank=True)
    title_4_body = models.TextField(null=True,blank=True)


    title_5 = models.CharField(max_length=100,null=True,blank=True)
    title_5_body = models.TextField(null=True,blank=True)

    created = models.DateField()
    publish = models.DateTimeField(default=timezone.now)
    slug = models.SlugField(max_length=250,
                            unique_for_date='created')

    status = models.CharField(max_length=250,
                    choices=STATUS_CHOICES,
                    default='draft')


    object = models.Manager()
    postManager = PostManager()


    class Meta():
        ordering = ('publish',)

    def __str__(self):
        return self.title

    def get_absolute_url(self):
        return reverse('post_detail',
                        args=[self.slug])

def get_image_filename(instance, filename):
    title = Post.title
    slug = slugify(title)
    return "media/%s-%s" % (slug, filename)


class Image(models.Model):
    post = models.ForeignKey(Post,
                            on_delete=models.CASCADE,
                            related_name='images')

    image_1 = models.ImageField(upload_to=get_image_filename,default='123.jpg',verbose_name="Image",null=True)
    image_2 = models.ImageField(upload_to=get_image_filename,default='123.jpg',verbose_name="Image",null=True)
    image_3 = models.ImageField(upload_to=get_image_filename,default='123.jpg',verbose_name="Image",null=True)
    image_4 = models.ImageField(upload_to=get_image_filename,default='123.jpg',verbose_name="Image",null=True)
    image_5 = models.ImageField(upload_to=get_image_filename,default='123.jpg',verbose_name="Image",null=True)

просмотров. py

def post_detail(request):
    post = get_object_or_404(Post)
    return render(request, 'blog_application/templates/single.html',
                            {'post':post})

index.html

{% for elem in posts %}

                <p class="mb-md-5">A small river named Duden flows by their place and supplies it with the necessary regelialia</p>
                    <p><a href="{ url elem.get_absolute_url }" class="btn btn-black px-3 px-md-4 py-3">Read More <span class="icon-arrow_forward ml-lg-4"></span></a></p>

            {% endfor %}

urls.py

path('post_detail/<slug:slug>',views.post_detail,name='single'),
path('', views.show_index, name='index'),

IЯ не совсем понимаю, как работает сопоставление и связывание URL для шаблонов. Может ли кто-нибудь быть достаточно любезным, чтобы объяснить на основе моего примера.

Ответы [ 2 ]

0 голосов
/ 30 октября 2019

перед тем, как я нырну, давайте согласимся, что слаг - это просто причудливое имя, это просто строка, ничего больше.

Хорошо, так что вы хотите понять, как работают URL-адреса django. Отключите PLZ

  • Давайте сначала разберемся, как работают URL, скажем, я открою этот сайт www.example.com и просто открою его как есть, Сайт просто открываетсяправильно? Вы ожидаете, что домашняя страница будет там

  • Теперь давайте откроем ее как www.example.com?text=welcome

Нажмите F12 вChrome и перейти на вкладку сети. По сути, вы добавили параметр, который отображается в chrome как «параметр строки запроса» в самом низу вкладки сети. Это говорит о том, что вы хотите посетить этот веб-сайт с параметром, который называется text, который содержитстрока привет

Хорошо , какова связь между этим и вопросом? потерпите меня, пожалуйста

Представьте, что у меня есть социальный веб-сайт с сообщениями, и я хочу создать код «слизняк» для каждого сообщения, чтобы при вводе в качестве параметра в URL он получал конкретное сообщение

сейчас это ваш urlpatterns.py

path('post_detail/<slug:slug>', views.post_detail, name='single'),
path('', views.show_index, name='index'),

Я предполагаю, что это простота проекта urls.py для уровня.

Пользователь заходит на сайт без каких-либоurl params или подстраницы, он просто вызывает ваш views.show_index

, теперь пользователь посещает ваш website/post_detail/, что происходит, если он видит, есть ли какой-либо urlpattern в urlpatterns, который соответствует этому, но это не так, так что это простоa 404

теперь пользователь посещает ваш website/post_detail/ANY_RANDOM_TEXT

В результате получается, что на самом деле существует urlpattern, который соответствует website/post_detail/ANY_RANDOM_TEXT, что path('post_detail/<slug:slug>', views.post_detail, name='single')

, следовательно, "ANY_RANDOM_TEXT"должен быть слаг, давайте тогда возьмем его за слаг!

теперь у нас есть слаг, и urlpattern вызовет views.post_detail (function или view) и передаст ему слаг, поэтому мы должны принятьэто правильно?

def post_detail(request, slug):
    post = get_object_or_404(Post, slug=slug)
    return render(request, 'blog_application/templates/single.html',
                            {'post':post})

теперь у вас есть доступ к 'slug', который является просто "ANY_RANDOM_TEXT", потому что мы сопоставили его, теперь получите сообщение с slug, которое совпадает с slug в url, и просто отобразите его!

Кстати, не забывайте косую черту в конце любого urlpattern, иначе мир взорвется

0 голосов
/ 30 октября 2019

По вашему мнению, есть две проблемы:

def post_detail(request, slug):
    post = get_object_or_404(Post, slug=slug)
    return render(request, 'blog_application/templates/single.html',
                            {'post':post})

в более общем примечании вы получаете значение slug из URL и передаете его в ваше представление с аргументом.

Кроме того, вам нужно передать аргумент get_object_or_404 см. this .

...