@blazer05

Не могу перевести в транслит ссылки?

Здравствуйте.
Нужна помощь в доработке кода блога.
Имеется модель блога в которую добавил поле slug
# -*- coding: utf-8 -*-

from django.db import models
from ckeditor.fields import RichTextField


class BlogPost(models.Model):
    class Meta(): # Этот класс прописывается для того, чтоб в базе данных можно было индентифицировать таблицу по ее названию в данном случае это 'blog_post'
        db_table = 'blog_blogpost'
        ordering = ['-timestamp']


    title = models.CharField(max_length=150, verbose_name = 'Заголовок')# По умолчанию это поле обязательное к заполнению blank=False. Если нам нужно оставить какое то поле пустым т.е. не обязятельным к заполнению то пишем параметр blank=True.
    text_redactor = RichTextField(blank=True, verbose_name='Краткое описание')
    text_redactor_full = RichTextField(blank=True, verbose_name='Полное описание')
    likes = models.IntegerField(default=0, verbose_name='Лайки')
    timestamp = models.DateTimeField(verbose_name = 'Дата')# Для числовых полей, если нужно оставить поле пустым - не обязательным к заполнению, то обязательно прописыть параметр blank=True, null=True
    slug = models.SlugField(max_length=150, verbose_name='Транслит', blank=True)
    autor = models.CharField(max_length=100, verbose_name= 'Автор', null=True, blank=True)
    body = models.TextField(verbose_name = 'Описание')# По умолчанию это поле обязательное к заполнению blank=False. Если нам нужно оставить какое то поле пустым т.е. не обязятельным к заполнению то пишем параметр blank=True.


    def __unicode__(self):      # Для python-3 кодировка прописывается так def __str__(self):
      return self.title


# Модель - Комментарии к статьям
class Comments(models.Model):
    class Meta():
        db_table = 'comments'

    comments_text = models.TextField(verbose_name='')
    comments_blogpost = models.ForeignKey(BlogPost)

В admin.py связал slug с title
prepopulated_fields = {"slug": ("title",)}
В админке при наборе текста в поле title на русском в поле slug автоматом переводит в латиницу - все работает вроде.
Но дальше не получается изменить функцию, которая отвечает за вывод полной новости, урл и шаблон.
Код из views.py делал тут по разному.
def full(reguest, one_id, slug):
    comment_form = CommentForm
    args = {}
    args.update(csrf(reguest))
    args['te'] = BlogPost.objects.get(id=one_id, slug=slug)
    #te = get_object_or_404(BlogPost, slug=slug)
    args['comments'] = Comments.objects.filter(comments_blogpost_id=one_id)
    args['form'] = comment_form
    args['username'] = auth.get_user(reguest).username
    return render_to_response('full.html', args)

В urls.py тут менял one_id на slug
url(r'^full/(?P<one_id>\d+)/$', views.full, name='full'),

В главном urls.py проекта
url(r'^blog/', include('blog.urls', namespace='blog')),

В шаблоне менял te.pk на te.slug
{% for te in te %}
<div class="panel panel-success">
  <div class="panel-heading">
      <a href="{% url 'blog:full' te.pk %}">{{ te.title }}</a>
  </div>
    <div class="panel-body">
    <p>{{ te.text_redactor|safe }}</p>
     <a href="{% url 'blog:full' te.pk %}"><button type="button" class="btn btn-default btn-xs">Читать далее >>></button></a>
  </div>
<div class="panel-footer">
    <div class="row">
      <div class="col-xs-6 col-md-4"><a href="/blog/addlike/{{ te.pk }}/"><img src="{% static "img/4594371.png" %}" width="30px" height="30px"></a>&nbsp;{{ te.likes }}</div>
         <div class="col-md-4 col-md-pull-1"><!--Соц.кнопки -->
<script type="text/javascript">(function(w,doc) {
if (!w.__utlWdgt ) {
    w.__utlWdgt = true;
    var d = doc, s = d.createElement('script'), g = 'getElementsByTagName';
    s.type = 'text/javascript'; s.charset='UTF-8'; s.async = true;
    s.src = ('https:' == w.location.protocol ? 'https' : 'http')  + '://w.uptolike.com/widgets/v1/uptolike.js';
    var h=d[g]('body')[0];
    h.appendChild(s);
}})(window,document);
</script>
<div data-background-alpha="0.0" data-buttons-color="#FFFFFF" data-counter-background-color="#ffffff" data-share-counter-size="12" data-top-button="false" data-share-counter-type="common" data-share-style="1" data-mode="share" data-like-text-enable="false" data-mobile-view="true" data-icon-color="#ffffff" data-orientation="horizontal" data-text-color="#000000" data-share-shape="round-rectangle" data-sn-ids="fb.vk.tw.ok.gp.mr.lj.ln." data-share-size="30" data-background-color="#ffffff" data-preview-mobile="false" data-mobile-sn-ids="fb.vk.tw.wh.ok.gp.mr.lj.ln." data-pid="1430623" data-counter-background-alpha="1.0" data-following-enable="false" data-exclude-show-more="false" data-selection-enable="true" class="uptolike-buttons" ></div>
  </div>
       <div class="col-xs-6 col-md-4"><h6>Дата публикации: {{ te.timestamp }}</h6></div>
    </div>
    </div>
</div>
{% endfor %}

Не могу понять, как сделать, чтоб ссылки имели четабельный вид а не так как сейчас blog/full/17/
  • Вопрос задан
  • 718 просмотров
Пригласить эксперта
Ответы на вопрос 1
@deliro
1) Говнокод. Зачем ты лезешь в Meta.db_table? Зачем в приложении Blog модель BlogPost? Дублирование как бы. Туда же вся модель Comments идёт. Кстати, да. Почему BlogPost в единственном числе, а Comments - во множественном? Модель Comments что, отражает несколько комментов сразу? text_redactor? Это что за поле такое? Что оно делает? Хранит редактор текста? А text_redactor_full? Хранит полную версию? autor - что это? Автор по-испански? Если да - почему он не ForeignKey к auth.User? Что такое args['te']? Что-то очевидное, что до моей деревни ещё не дошло? {% for te in te %}? Серьёзно? Как это вообще понимать?
2) А теперь по делу:
Поле SlugField не должно быть blank по определению. Slug - уникальная (для текущей таблицы) последовательность символов.
Заменить в urls:
url(r'^full/(?P<slug>[\w-]+)/$', views.full, name='full'),

В модели Post добавить метод:
# Где-то в импортах:
from django.core.urlresolvers import reverse

# Внутри модели Post:
def get_absolute_url(self):
    return reverse('full', kwargs={'slug': self.slug})

И все ссылки на пост делать в таком виде:
<a href="{{ post.get_absolute_url }}">{{ post.title }}</a>

3) Slug - это не транслит!
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы