введите описание изображения здесь Я в процессе создания веб-сайта о фэнтези-спорте. Стандартный пользователь django равен владельцу команды. В моем файле blog / models.py я создал класс Player
(он же игрок НБА) с полем внешнего ключа player_owner
, указывающим на User
:
# blog/models.py
class Player(models.Model):
player_full = models.CharField(max_length=50)
player_owner = models.ForeignKey(User, blank=True, null=True, on_delete=models.SET_NULL)
image = models.ImageField(default='default_player.jpg', upload_to='player_pics')
player_unit_value = models.PositiveSmallIntegerField(default=1, validators=[MinValueValidator(1),
MaxValueValidator(1)])
Как вы можете Видите ли, у меня также есть поле класса Player с именем player_unit_value
, которое постоянно установлено на 1. Это, я думаю, сыграет роль в моем вопросе. У меня настроено множество веб-сайтов: страница бесплатных агентов, панель управления команды, профиль игрока, финансовые данные и т. Д. c - все они построены с проверкой формы, чтобы гарантировать, что игроки «подписаны» и «удалены» авторизованным авторизованным игроком User
(он же владелец команды).
# blog/views.py
class PlayersUpdateView(LoginRequiredMixin, UpdateView, Player):
model = Player
fields = []
template_name = 'blog/player_form.html' # <app>/<model>_<viewtype>.html
context_object_name = 'guys'
def form_valid(self, form):
form.instance.player_owner = self.request.user
return super().form_valid(form)
Таким образом, когда вы нажимаете «добавить игрока» на моем сайте, поле этого игрока player_owner
изменяется с «Нет» на User
. а кнопка "Drop Player" делает обратное.
Итак, вот мой вопрос: Как я могу создать logi c, который ограничивает количество раз User
(иначе собственник) можно выбрать как player_owner
на 15? В идеале, я бы хотел, чтобы была какая-то проверка формы, которая - при инициировании User
, у которого уже есть 15 игроков - показывала недопустимое предупреждение: «Извините, у вас уже есть максимальное количество игроков в вашем списке». "
Вот еще одна часть, которая может быть полезна: я создал поле в моем классе профиля Users / models.py с именем players_owned
:
# users/models.py
class Profile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
image = models.ImageField(default='default.jpg', upload_to='profile_pics')
players_owned = models.PositiveSmallIntegerField(default=0,
validators=[MinValueValidator(0),
MaxValueValidator(15)]
)
Я подозреваю, что может быть способ + = 1 к полю пользователя players_owned
каждый раз, когда Player
добавляется в команду пользователя (также известный как каждый раз, когда поле Player.player_owner обновляется с None до User
(также известного как Owner). Но эти два классы находятся в разных файлах моделей.
Я новичок в python и django, поэтому приношу свои извинения заранее, если это немного чокнутый.
Обновленный код:
blog / views.py
from django.shortcuts import render, get_object_or_404, redirect
from django.contrib.auth.mixins import LoginRequiredMixin, UserPassesTestMixin
from django.contrib.auth.models import User
from django.contrib import messages
from django.db.models import Sum, Q
from django.views.generic import (
ListView,
DetailView,
CreateView,
UpdateView,
DeleteView)
from users.forms import ProfileUpdateForm
from .models import Post, Player
class PlayersUpdateView(LoginRequiredMixin, UpdateView, Player):
model = Player
fields = []
template_name = 'blog/player_form.html' # <app>/<model>_<viewtype>.html
def get(self, request, *args, **kwargs):
form = ProfileUpdateForm()
return render(request=request, template_name=self.template_name, context={
"form": form
})
def post(self, request, *args, **kwargs):
form = ProfileUpdateForm(request.POST)
if form.is_valid():
if request.user.players_owned <= 5:
form.instance.player_owner = self.request.user
request.user.players_owned = request.user.players_owned + 1
request.user.save()
return redirect("players-update")
else:
messages.error(request, "Sorry, you already have the max number of players on your roster")
return render(request, self.template_name, {'form': form})
Вопросы: Следует ли импортировать модель Profile
из users / models.py? Может быть, это def не принадлежит PlayerUpdateView
?
blog / models.py: не изменено
blog / player_form. html
{% extends "blog/base.html" %}
{% load crispy_forms_tags %}
{% block content %}
<head>
<script>
{% if messages %}
{% for message in messages %}
alert(message);
{% endfor %}
{% endif %}
</script>
</head>
<div class="content-section">
<form method="POST">
{% csrf_token %}
<fieldset class="form-group">
<legend class="border-bottom mb-4">Adding {{ object.player_full }}</legend>
<img class="rounded-circle article-img" src="{{ object.image.url }}">
{{ form|crispy }}
<h4>Are you sure you want to add <kbd>{{ object.player_full }}</kbd> to your team?</h4>
</fieldset>
<div class="form-group">
<button class="btn btn-outline-success" type="submit">Add Player</button>
<a class="btn btn-outline-secondary" href="{% url 'players-detail' object.id %}">Cancel</a>
</div>
</form>
</div>
{% endblock content %}
users / models.py
from django.core.validators import MinValueValidator, MaxValueValidator
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')
players_owned = models.PositiveSmallIntegerField(default=0,
validators [MinValueValidator(0), MaxValueValidator(15)])
users / forms.py
from django import forms
from django.contrib.auth.models import User
from django.contrib.auth.forms import UserCreationForm
from .models import Profile
class UserRegisterForm(UserCreationForm):
email = forms.EmailField()
class Meta:
# when submitted creates ...user
model = User
# these are the fields we want on our form
fields = ['username', 'email', 'password1', 'password2']
class UserUpdateForm(forms.ModelForm):
email = forms.EmailField()
class Meta:
# when submitted updates ...user
model = User
# these are the fields we want on our form
fields = ['username', 'email']
class ProfileUpdateForm(forms.ModelForm):
class Meta:
model = Profile
fields = ['image', 'players_owned']
Вопрос: следует ли мне использовать UserUpdateForm
вместо этого?
Кстати, вот последняя ошибка, которую я получил:
NoReverseMatch at /players/529/update/
Reverse for 'players-detail' with arguments '('',)' not found. 1
pattern(s) tried: ['players/(?P<pk>[0-9]+)/$']
Request Method: GET
Request URL: http://127.0.0.1:8000/players/529/update/
Django Version: 3.0.7
Exception Type: NoReverseMatch
Exception Value:
Reverse for 'players-detail' with arguments '('',)' not found. 1
pattern(s) tried: ['players/(?P<pk>[0-9]+)/$']