Управление использованием данных из одного приложения Django в другом, но адреса разные - PullRequest
2 голосов
/ 05 апреля 2019

В этот предыдущий вопрос, который я задавал об использовании данных из одного приложения Django в другом.Я хотел использовать данные блога из моего блогового приложения в моем приложении страниц.Цель в том, чтобы на моей домашней странице отображались 3 самые последние записи.

Ответ , предоставленный , был приемлемым в то время.Однако с тех пор я хотел настроить элементы блога, которые отображаются на моей домашней странице, как ссылки на сам элемент блога, но элементы блога на моей домашней странице имеют другой путь URL.Есть ли способ обойти это?

Вот мой код:

Блог

from .views import (
    BlogListView,
    BlogUpdateView,
    BlogDetailView,
    BlogDeleteView,
    BlogCreateView,
)


urlpatterns = [
    path('<int:pk>/edit/',
         BlogUpdateView.as_view(), name='Blog_edit'),
    path('<int:pk>/',
         BlogDetailView.as_view(), name='Blog_detail'),
    path('<int:pk>/delete/',
         BlogDeleteView.as_view(), name='Blog_delete'),
    path('new/', BlogCreateView.as_view(), name='Blog_new'),
    path('', BlogListView.as_view(), name='Blog_list'),
]

models.py

class Blog(models.Model):
    title = models.CharField(max_length=255)
    body = models.TextField()
    date = models.DateTimeField(auto_now_add=True)
    author = models.ForeignKey(
        get_user_model(),
        on_delete=models.CASCADE,
    )
    thumb = models.ImageField(blank=True, null=True)

    def __str__(self):
        return self.title

    def get_absolute_url(self):
        return reverse('Blog_detail', args=[str(self.id)])

views.py

class BlogListView(ListView):
    model = Blog
    template_name = 'blog_list.html'


class BlogDetailView(DetailView):
    model = Blog
    template_name = 'blog_detail.html'
    login_url = 'login'


class BlogUpdateView(LoginRequiredMixin, UpdateView):
    model = Blog
    fields = ('title', 'body', 'thumb')
    template_name = 'blog_edit.html'
    login_url = 'login'

    def test_func(self):
        obj = self.get_object()
        return obj.author == self.request.user


class BlogDeleteView(LoginRequiredMixin, DeleteView):
    model = Blog
    template_name = 'blog_delete.html'
    success_url = reverse_lazy('blog_list')
    login_url = 'login'

    def test_func(self):
        obj = self.get_object()
        return obj.author == self.request.user


class BlogCreateView(LoginRequiredMixin, CreateView):
    model = Blog
    template_name = 'blog_new.html'
    fields = ('title', 'body', 'thumb')
    login_url = 'login'

    def form_valid(self, form):
        form.instance.author = self.request.user
        return super().form_valid(form)

страниц

urls.py

urlpatterns = [
    path('', HomePageView, name='home'),
]

views.py

def HomePageView(request):
    context = {}
    blog = Blog.objects.order_by('-date')[:3]
    context['blog']=blog
    return render(request,'home.html',context)

home.html

{% extends 'base.html' %}

{% block title %}Home{% endblock title %}

{% block content %}
    <div class="jumbotron">
        <h1 class="display-4">Lakeland Cycle Club</h1>
        <p class="lead">The home of cycling in Fermanagh.</p>
        <p class="lead">
            <a class="btn btn-primary btn-lg" href="{% url 'blog_list' %}" role="button">View All Club News</a>
        </p>
        {% for new in blog%}
            <div class="card" style="width: 300px; display: inline-block; margin: 5px; vertical-align: top;">
                <div class="card-header">
                    <span class="font-weight-bold">
                        {{ new.title }}
                    </span> &middot;
                    <span class="text-muted">by {{ new.author }} | {{ new.date }}</span>
                </div>
                <div class="card-body">
                    {% if blog.thumb %}
                        <p align="center"><img src="{{ new.thumb.url }}" /></p>
                    {% endif %}
                    <p>{{ new.body | linebreaks | truncatewords:30 }}
                </div>
            </div>
        {% endfor %}
{% endblock content %}

Подробнее.

Я думаю, что если я добавлю URL к своему заголовку ({{ new.title }}), он может работать так, как я хочу.Я попытался <a href="{% url 'blog_detail' %}">{{ new.title }}</a>, но получил эту ошибку:

django.urls.exceptions.NoReverseMatch: Reverse for 'blog_detail' with no arguments not found. 1 pattern(s) tried: ['blog/(?P<pk>[0-9]+)/$']

Причина, скорее всего, заключается в том, что у каждого элемента на моей домашней странице нет способа определить первичный ключ для конкретной записи в блоге.Если я изменю URL-адрес на blog_list, первичный ключ не требуется, поэтому я без проблем попаду на страницу blog_lost.Как добавить URL-ссылку и убедиться, что она ссылается на правильный пост blog_detail?

1 Ответ

0 голосов
/ 10 апреля 2019

Я внес следующие изменения:

templates / home.html

Я изменил

<span class="font-weight-bold">
  {{ new.title }}
</span> &middot;

для

<span class="font-weight-bold">
  <a href="{% url 'pages_blog_detail' new.pk %}">{{ new.title }}</a>
</span> &middot;

pages / urls.py

Я добавил

from blog.views import BlogDetailView

и изменил

urlpatterns = [
    path('', HomePageView, name='home'),
]

на

urlpatterns = [
    path('blog/<int:pk>/',
        BlogDetailView.as_view(), name='pages_blog_detail'),
    path('', HomePageView, name='home'),
]
...