написание модели для сайта со статьями на python django

shkuin

Новичок
Пользователь
Апр 16, 2020
11
1
3
я сделал шаблон для статей, написал модель для статей(см. вложения), но как мне сделать так, чтобы каждая статья смотрелась прилично, т.е. были абзацы, заголовки , ссылки, картинки и т.д.(как у любой нормальной статьи), ведь не сделаешь один единый шаблон для такого случая, т.к. в каждой статье разное количество фотографий , абзацев, заголовков и т.п.
Объясните пожалуйста как это реализовать, или скиньте ссылки где об этом рассказывают, буду безумно благодарен!!!

1587198881662.png
1587198979432.png
1587198993824.png
 

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
Если структура у статей похожая например: главный заголовок, заголовок, абзац, картинка, заголовок, абзац, картинка и .т. д. то можно реализовать на одном шаблоне. В модель прописать что-то типа:
Python:
class Article(models.Model):   
    title = models.CharField(max_length=200)
    pub_date = models.DateTimeField(auto_now_add=True)   
    photo_1 = models.ImageField(upload_to='photos/%Y/%m/%d', blank=True)
    photo_2 = models.ImageField(upload_to='photos/%Y/%m/%d', blank=True)
    photo_3 = models.ImageField(upload_to='photos/%Y/%m/%d', blank=True)
    photo_4 = models.ImageField(upload_to='photos/%Y/%m/%d', blank=True)
    photo_5 = models.ImageField(upload_to='photos/%Y/%m/%d', blank=True)
    photo_6 = models.ImageField(upload_to='photos/%Y/%m/%d', blank=True)   
    paragraph_1 = models.TextField(blank=True)
    subheader_1 = models.CharField(max_length=200, blank=True)
    paragraph_2 = models.TextField(blank=True)
    subheader_2 = models.CharField(max_length=200, blank=True)
    paragraph_3 = models.TextField(blank=True)
    subheader_3 = models.CharField(max_length=200, blank=True)
    paragraph_4 = models.TextField(blank=True)
    subheader_4 = models.CharField(max_length=200, blank=True)
    paragraph_5 = models.TextField(blank=True)
    subheader_5 = models.CharField(max_length=200, blank=True)
    paragraph_6 = models.TextField(blank=True)
    subheader_6 = models.CharField(max_length=200, blank=True)
    is_published = models.BooleanField(default=True)
    
    def __str__(self):
        return self.title
А в шаблоне выводить данные если они есть:
Код:
<h1>{{article.title}}</h1>
{% if article.subheader_1 %}
    <h2>{{article.subheader_1}}</h2>
{% endif}
{% if article.paragraph_1 %}
    <p>{{article.paragraph_1}}</p>
{% endif}
{% if article.photo_1 %}
    <img src="{{article.photo_1.upload_to}}" />
{% endif}
...
{% if article.subheader_6 %}
    <h2>{{article.subheader_6}}</h2>
{% endif}
{% if article.paragraph_6 %}
    <p>{{article.paragraph_6}}</p>
{% endif}
{% if article.photo_6 %}
    <img src="{{article.photo_6.upload_to}}" />
{% endif}
Если статьи имеют разную структуру, то под каждую структуру нужно либо делать отдельный шаблон либо использовать переменные контекста (они передаются в шаблон из вью) и условия чтобы в зависимости от них выводить части шаблона (форму комментариев, блок картинок, пагинацию, навигацию, слайдер, отзывы, контакты и т. д.), а сами части хранить в отдельных шаблонах и вставлять в основной при помощи include. Также в качестве частей шаблона можно использовать шаблонные теги.
 
  • Мне нравится
  • Я влюблен!
Реакции: shkuin и Student

shishkinav

Пользователь
Пользователь
Апр 18, 2020
11
9
3
...но как мне сделать так, чтобы каждая статья смотрелась прилично, т.е. были абзацы, заголовки , ссылки, картинки и т.д.(как у любой нормальной статьи), ведь не сделаешь один единый шаблон для такого случая, т.к. в каждой статье разное количество фотографий , абзацев, заголовков и т.п.
Возможно стоит посмотреть в сторону markdown разметки? конвертирования из него?
Ведь статьи будут появляться путем написания пользователями? Можно редактор прикрутить для юзабилити.
 
  • Мне нравится
Реакции: Student

shkuin

Новичок
Пользователь
Апр 16, 2020
11
1
3
Если структура у статей похожая например: главный заголовок, заголовок, абзац, картинка, заголовок, абзац, картинка и .т. д. то можно реализовать на одном шаблоне. В модель прописать что-то типа:
Python:
class Article(models.Model):  
    title = models.CharField(max_length=200)
    pub_date = models.DateTimeField(auto_now_add=True)  
    photo_1 = models.ImageField(upload_to='photos/%Y/%m/%d', blank=True)
    photo_2 = models.ImageField(upload_to='photos/%Y/%m/%d', blank=True)
    photo_3 = models.ImageField(upload_to='photos/%Y/%m/%d', blank=True)
    photo_4 = models.ImageField(upload_to='photos/%Y/%m/%d', blank=True)
    photo_5 = models.ImageField(upload_to='photos/%Y/%m/%d', blank=True)
    photo_6 = models.ImageField(upload_to='photos/%Y/%m/%d', blank=True)  
    paragraph_1 = models.TextField(blank=True)
    subheader_1 = models.CharField(max_length=200, blank=True)
    paragraph_2 = models.TextField(blank=True)
    subheader_2 = models.CharField(max_length=200, blank=True)
    paragraph_3 = models.TextField(blank=True)
    subheader_3 = models.CharField(max_length=200, blank=True)
    paragraph_4 = models.TextField(blank=True)
    subheader_4 = models.CharField(max_length=200, blank=True)
    paragraph_5 = models.TextField(blank=True)
    subheader_5 = models.CharField(max_length=200, blank=True)
    paragraph_6 = models.TextField(blank=True)
    subheader_6 = models.CharField(max_length=200, blank=True)
    is_published = models.BooleanField(default=True)
   
    def __str__(self):
        return self.title
А в шаблоне выводить данные если они есть:
Код:
<h1>{{article.title}}</h1>
{% if article.subheader_1 %}
    <h2>{{article.subheader_1}}</h2>
{% endif}
{% if article.paragraph_1 %}
    <p>{{article.paragraph_1}}</p>
{% endif}
{% if article.photo_1 %}
    <img src="{{article.photo_1.upload_to}}" />
{% endif}
...
{% if article.subheader_6 %}
    <h2>{{article.subheader_6}}</h2>
{% endif}
{% if article.paragraph_6 %}
    <p>{{article.paragraph_6}}</p>
{% endif}
{% if article.photo_6 %}
    <img src="{{article.photo_6.upload_to}}" />
{% endif}
Если статьи имеют разную структуру, то под каждую структуру нужно либо делать отдельный шаблон либо использовать переменные контекста (они передаются в шаблон из вью) и условия чтобы в зависимости от них выводить части шаблона (форму комментариев, блок картинок, пагинацию, навигацию, слайдер, отзывы, контакты и т. д.), а сами части хранить в отдельных шаблонах и вставлять в основной при помощи include. Также в качестве частей шаблона можно использовать шаблонные теги.
понял, спасибо большое, значит все сделать надо через условные операторы
 

Форум IT Специалистов