Django при нажатии показать другой атрибут модели - PullRequest
0 голосов
/ 21 февраля 2020

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

model.py

from django.db import models
from datetime import datetime   
from django.contrib.auth.models import User

def get_default_user():
    return User.objects.get(id=1)

class EveryPost(models.Model):
    title_pl = models.CharField(max_length=100, blank=True)
    title_ru = models.CharField(max_length=100, blank=True)
    text_pl = models.TextField(blank=True)
    text_ru = models.TextField(blank=True)
    date = models.DateTimeField(default=datetime.now, blank=True)
    User = models.ForeignKey(User, on_delete=models.CASCADE, default=get_default_user)

    def __str__(self):
        return self.title_pl

html

    {% for obj in EveryPost %}
        <div class="card text-center">
            <div class="card-header">
                <ul class="nav nav-tabs card-header-tabs">
                <li class="nav-item">
                    <a class="nav-link nav-main" href="{% url 'rupl' obj.pk %}">PL</a>
                </li>
                <li class="nav-item">
                    <a class="nav-link nav-main" href="{% url 'plru' obj.pk %}">RU</a>
                </li>
                </ul>
            </div>
            <div class="card-body">
                <h5 class="card-title"><a href="{% url 'detailpost' obj.pk %}">{{ obj.title_pl }}</a></h5>
                <p class="card-text">{{ obj.text_pl|truncatechars:350 }}</p>
                <a href="{% url 'detailpost' obj.pk %}" class="btn btn-dark float-right">Zobacz </a>
            </div>
            <div class="card-footer text-muted">
                <span class="float-left">{{ obj.date|date:"d M y" }}</span>
                <span class="float-right">Przesłane przez: {{ obj.User }}</span>
            </div>
        </div>
    {% endfor %}

Я пытался переключиться между text_pl и text_ru, но это не очень хорошая идея (потерянные данные)

views.py

def plru(request, pk):
    post = EveryPost.objects.get(pk=pk)
    post.text_pl = post.text_ru
    post.title_pl = post.title_ru
    post.save()
    return redirect('index')

def rupl(request, pk):
    post = EveryPost.objects.get(pk=pk)
    post.text_ru = post.text_pl
    post.title_ru = post.title_pl
    post.save()
    return redirect('index')

Изображение, объясняющее, чего я хочу достичь

Ответы [ 2 ]

0 голосов
/ 21 февраля 2020

Я исправил это, возможно, это не самый эффективный способ, но работает, хотя:)

Я добавляю один дополнительный элемент в модель : version_pl = models.BooleanField(default=True)

Так что в HTML он проверяет, является ли True или False:

            <div class="card-body">
            {% if obj.version_pl == False %}
                <h5 class="card-title"><a href="{% url 'detailpost' obj.pk %}">{{ obj.title_ru }}</a></h5>
                <p class="card-text">{{ obj.text_ru|truncatechars:350 }}</p>
            {% else %}
                <h5 class="card-title"><a href="{% url 'detailpost' obj.pk %}">{{ obj.title_pl }}</a></h5>
                <p class="card-text">{{ obj.text_pl|truncatechars:350 }}</p>
            {% endif %}
                <a href="{% url 'detailpost' obj.pk %}" class="btn btn-dark float-right">Zobacz całość</a>
            </div>

и views.py

def rupl(request, pk):
    post = EveryPost.objects.get(pk=pk)
    post.version_pl = True
    post.save()
    return redirect('index')

def plru(request, pk):
    post = EveryPost.objects.get(pk=pk)
    post.version_pl = False
    post.save()
    return redirect('index')

Спасибо за ответы

0 голосов
/ 21 февраля 2020

нет необходимости в большом количестве функций и URL, просто лучше: в views.py:

def post_detail(request, post_id):
     post = get_or_404(Post, id= post_id)
     return render(request, 'post_details.html")

в post_details. html:

<div id="post_in_1st_lng" style="visibility: visible;">
    {{ post.title_pl }}
</div>
<div id="post_in_2nd_lng" style="visibility: hidden;">
    {{ post.title_ru }}
</div>
<button id="lan_change">Change Language </button>

<script>
     $("#lan_change").on('click', function (){
          first_vis = $("#post_in_1st_lng").css('visibility') == "visible" ? "hidden" : "visible";
          sec_vis = $("#post_in_2nd_lng").css('visibility') == "visible" ? "hidden" : "visible";
          $("#post_in_2nd_lng").css('visibility', sec_vis);
          $("#post_in_1st_lng").css('visibility', first_vis);
     });
</script>

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...