Создание ссылок на страницу, которая отображает определенные строки в моей базе данных w / django? - PullRequest
0 голосов
/ 09 февраля 2019

Я создал разбавленный проект на основе моего более сложного проекта для этого вопроса, чтобы помочь доставить мой вопрос более эффективно.Я включу приведенный ниже код для будущих читателей этого поста, но для удобства / удобства здесь - это URL-адрес хранилища gitlab.

У меня есть модель "NotesModel", которая моделирует архитектуруобратите внимание, что вы можете принять в течение дня.Это довольно просто, есть «заголовок», «тег» и, конечно, основная часть, которую я называю «контент».Тег похож на тег, который вы связываете со своим постом переполнения стекаЭто просто для того, чтобы определить тему, о которой может быть написана конкретная заметка.

В моем представлении на основе функций я запрашиваю каждую строку в своей базе данных и передаю ее моей функции render(.., .., {'notes': notes}), как вы увидите ниже.С некоторыми стилями html / bootstrap я отображаю каждый элемент из столбца 'tag' в моей базе данных как метку, которая может быть связана с синтаксисом ... a href = "" ... как таковым.

    {% for note in notes %}
        <span class="label label-primary" id="tags">
            <a id="theurl" href="this is where my confusion is">
            {{note.tag}}
            </a>
        </span>
    {% endfor %}

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

Снимок экрана

Я хочу, чтобы этот ярлык воспринимался как фактический тег, который вы можете найти на каком-либо форуме.Поведение выглядит следующим образом ...

1) Пользователь нажимает на метку
2) Django направляет пользователя на другую страницу
3) Строки в базе данных, которые атрибут 'tag'(будучи столбцом) совпадает с названием метки будет отображаться.

Позвольте мне объяснить немного больше.Из рисунка выше вы можете видеть, что в базу данных уже внесено четыре заметки (четыре строки в терминологии базы данных).Поэтому атрибут 'tag' (являющийся столбцом 'tag' в терминологии базы данных) имеет четыре экземпляра: starwars , startrek , avp и еще один starwars экземпляр.Я хочу иметь возможность нажимать на тег starwars , и он направляет меня на другую страницу, на которой отображаются все заметки с тегом starwars .То же самое касается других тегов.Если я нажму startrek , то я хочу, чтобы это перенаправило меня на другую страницу, которая отображает все заметки с тегом startrek .

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

queryset = NotesModel.objects.filter(tag__icontains='starwars')

Затем я просто набрал прямую ссылку на эту страницу в ... ahref = "" ... кусок кода.Однако с этим решением есть две проблемы ...

1. Это работает только для starwars
2. Если бы я сделал это таким образом, мне пришлось бы создать x number of page.html.файлы в моей папке шаблонов с равным количеством х представлений функций на основе вышеуказанного набора запросов.Это более статичный, а не динамичный способ выполнения задач, поэтому как мне решить такую ​​задачу?

Ниже приведены файлы в моем проекте на данный момент.Как я уже говорил ранее, я включаю URL-адрес хранилища gitlab выше, если вы захотите завершить проект самостоятельно.

the_app / urls.py

from django.urls import path
from . import views
urlpatterns = [
    path('', views.home, name='home'),
]

the_app / models.py

from django.db import models
class NotesModel(models.Model):
    title = models.CharField(max_length=100, blank=True)
    tag = models.CharField(max_length=100, blank=False)
    content = models.CharField(max_length=1000, blank=False)
    def __str__(self):
        return self.title

the_app/forms.py

from django import forms
from .models import NotesModel
class NotesForm(forms.ModelForm):
    class Meta:
        model = NotesModel
        fields = ['title', 'tag', 'content']

the_app / views.py

from django.shortcuts import render
from .models import NotesModel
from .forms import NotesForm

def home(request):

    # Grab the form data
    if request.method == 'POST':
        form = NotesForm(request.POST)
        if form.is_valid():
            form.save()
            form = NotesForm()
    else:
        form = NotesForm()

    # Grab the data from the database
    notes = NotesModel.objects.all()

    return render(request, 'the_app/page_home.html', {'form': form, 'notes': notes})

the_app / templates / the_app / base.html

{% load static %}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.0/css/bootstrap.min.css">
    <link rel="stylesheet" type="text/css" href="{% static 'mystyle.css' %}">
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.0/js/bootstrap.min.js"></script>
</head>
<body>
<div>
    {% block notesform %}{% endblock notesform %}
</div>
<div>
    {% block notetags %}{% endblock notetags %}
</div>
</body>
</html>

the_app / templates / the_app / page_home.html

{% extends "the_app/base.html" %}

{% block notesform %}
<form method="POST" enctype="multipart/form-data">
    {% csrf_token %}
    {{ form }}
    <button type="submit" class="btn btn-primary">Submit</button>
</form>
{% endblock notesform %}

{% block notetags %}
    {% for note in notes %}
        <span class="label label-primary" id="tags">
            <!-- I didn't know what to put here so i used google's url as a place holder-->
            <a id="theurl" href="https://www.google.com">
            {{note.tag}}
            </a>
        </span>
    {% endfor %}
{% endblock notetags %}

1 Ответ

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

Вот проблема, queryset = NotesModel.objects.filter(tag__icontains='starwars') ваш тег содержит только звездные войны.Поэтому он не найдет другие теги.

class TagPostView(ListView):
   model = NoteModel
   template_name = '....'
   context_object_name = 'all_notes_of_this_tag'

   def get_queryset(self):
      result = super(PostTagView, self).get_queryset()
      query = self.request.GET.get('q')
      if query:
         postresult = NoteModel.objects.filter(tag__icontains=query)
         result = postresult
      else:
         result = None
      return result

Теперь вы можете передать метку как q, и она будет искать этот тег и показывать результат.Все, что вам нужно, - это только один шаблон.

В шаблоне, который вы можете использовать,

{% for note in all_notes_of_this_tag %}
{{note.title}}
#..
{% endfor %}

Это решит все три требования.

...