Как мне увеличить IntegerField в Django? - PullRequest
0 голосов
/ 28 февраля 2020

Я создаю веб-приложение списка Todo в Django. Я только учусь Django и очень начинающий, поэтому любая помощь очень ценится. Моя проблема:

Мое приложение позволит пользователям зарегистрироваться, и у них будет собственный профиль. Они могут создавать задачи и удалять их по своему усмотрению. Теперь я хочу представить атрибут всем пользователям, который называется «задачи». По сути, это целочисленное значение, которое будет отслеживать количество созданных ими задач с момента их регистрации. И каждый раз, когда пользователь добавляет новую задачу, я хочу, чтобы это значение увеличивалось на 1. Я просто не могу понять, как это реализовать.

Это мое models.py

from django.db import models
from django.contrib.auth.models import User
from PIL import Image

class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    image = models.ImageField(default="default.jpg", upload_to="profile_pics")
    todos = models.IntegerField(default=0)

    def __str__(self):
        return f"{self.user.username} Profile"


    def save(self):
        super().save()

        img = Image.open(self.image.path)

        if img.height > 300 or img.width > 300:
            output_size = (300, 300)
            img.thumbnail(output_size)
            img.save(self.image.path)

views.py

class TodoListView(ListView):
    model = ToDo
    template_name = "ToDo/home.html"
    context_object_name = "todos"
    ordering = ["-date_posted"]


class TodoCreateView(CreateView):
    model = ToDo
    fields = ["title"]
    success_url = reverse_lazy("todo-home")

    def form_valid(self, form):
        form.instance.creator = self.request.user
        user = User.objects.get(username=self.request.user.username)
        user.profile.todos += 1
        return super().form_valid(form)

В методе form_valid я пытался увеличить это значение, но это не похоже на работу. Поскольку у меня есть доступ к панели администратора, я вижу, что при добавлении новой задачи число todos не увеличивается.

Я ищу метод, который может увеличивать это значение, и я могу вызывать его удобно при необходимости. Кроме того, было бы очень полезно, если бы кто-то мог показать, как получить это значение todos в шаблоне, чтобы я мог использовать это значение в Html. Благодаря.

Ответы [ 2 ]

1 голос
/ 28 февраля 2020

Вам не хватает метода сохранения в методе form_valid

class TodoListView(ListView):
    model = ToDo
    template_name = "ToDo/home.html"
    context_object_name = "todos"
    ordering = ["-date_posted"]


class TodoCreateView(CreateView):
    model = ToDo
    fields = ["title"]
    success_url = reverse_lazy("todo-home")

    def form_valid(self, form):
        form.instance.creator = self.request.user
        user = User.objects.get(username=self.request.user.username)
        user.profile.todos += 1
        user.profile.save()
        return super().form_valid(form)

Если вы хотите sh для доступа к ним из шаблонов, вы можете просто использовать user.profile.todos напрямую. EG {{ user.profile.todos }} или {% if user.profile.todos > 1 %}More than one{% endif %}

1 голос
/ 28 февраля 2020

Полагаю, если вы добавите user.save(), это решит часть вашей проблемы

user.profile.todos += 1
user.save()

Но я рекомендую вам реорганизовать ваш код, добавив Profile foreign_key для ToDo модели, тогда вы можете получить считать с ToDo.models.filter(profile__user = myuser).count(), и это даст вам правильный номер, если вы удалите объект ToDo тоже. Кроме того, это дает вам возможность фильтровать список ToDo для указанного пользователя c.

Также вы можете создать вычисляемое поле и вызывать его, когда вам нужно.

class Profile(models.Model)
    ###

    get_todo_count(self):
        return ToDo.models.filter(profile = self).count()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...