Изменения в экземпляре модели не отображаются в Tempalate - PullRequest
2 голосов
/ 29 марта 2019

Я новичок в django, и я пытаюсь создать подобную жопу. Когда я нажимаю на кнопку, я вижу, что модель Like обновляется вместе с пользователем и публикацией, которая ему понравилась. Затем я также вижу, что общее количество лайков в модели Post увеличивается на 1. Но сам шаблон по-прежнему показывает 0 лайков.

class Post(models.Model):

    user = models.ForeignKey(settings.AUTH_USER_MODEL,
                             on_delete=models.CASCADE)
    title = models.CharField(max_length=255)
    description = models.CharField(max_length=255)
    content = models.TextField()
    created_date = models.DateTimeField(default=timezone.now)
    published_date = models.DateTimeField(blank=True, null=True)
    categorys = models.ManyToManyField('Category')
    tags = models.ManyToManyField('Tag')
    likes = models.IntegerField(default=0)
    slug = models.SlugField(max_length=100, unique=True)
    image = models.ImageField(null=True, upload_to=post_image_file_path)

'' '

class Like(models.Model):

    user = models.ForeignKey(settings.AUTH_USER_MODEL,
                             on_delete=models.CASCADE)
    post = models.ForeignKey('Post', on_delete=models.CASCADE)
    created = models.DateTimeField(default=timezone.now)

'' '

 path('', views.home_view, name='home'),
 path('like/', views.like, name='like'),

'' '

def home_view(request, *args, **kwargs):
    all_posts = services.get_all_posts()
    all_categorys = services.get_all_categorys()
    all_tags = services.get_all_tags()
    context = {'all_posts': all_posts, 'all_categorys': all_categorys,
               'all_tags': all_tags}

    return render(request, 'blog/home.html', context)


def like(request, *args, **kwargs):
    if request.method == 'GET':
        model = get_user_model()
        postid = request.GET.get('postid')
        user = model.objects.get(id=request.user.id)
        post = Post.objects.get(id=postid)

        if Like.objects.filter(user=user, post=post).exists():
           Like.objects.filter(user=user, post=post).delete()
           update_likes = Post.objects.get(id=post.id)
           update_likes.likes -= 1  # change field
           update_likes.save()  # this will update only
        else:
           like = Like.objects.create(user=user, post=post)
           update_likes = Post.objects.get(id=post.id)
           update_likes.likes += 1  # change field
           update_likes.save()  # this will update only
    return redirect('blog:home')

'' '

   {% for post in all_posts %}

       html...


      <form action="{% url 'blog:like'%}" method="GET">
        <input type="hidden" name="postid" value="{{ post.id }}">
        <button type="submit" class="btn btn-success">Like</button>
      </form>

      <p>total = {{ post.likes }}</p>

   {% endfor %}

'' '

Я уверен, что это не лучший способ сделать это, но мне нравится понимать, почему шаблон не обновляется с новым значением после перенаправления в домашний вид.

1 Ответ

0 голосов
/ 29 марта 2019

Вам нужно использовать ajax для автоматического обновления шаблона, в противном случае вам придется обновляться каждый раз

Также добавьте декоратор never_cache

По вашему мнению в файле views.py

from django.views.decorators.cache import never_cache

@never_cache
def yourView(...):
    ....

или если у вас есть представление на основе классов

from django.views.decorators.cache import never_cache

class YourView(View):
    @never_cache
    def dispatch(self,request,*args,**kwargs):
        return super().dispatch(request,*args,**kwargs)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...