Я сделал форму (фактически Formset) с помощью modelformset_factory.Я отображаю его с помощью
<form method="post" action="">
{% csrf_token %}
{{ player_formset.management_form }}
{% for player_form in player_formset %}
{% for field in player_form %}
{{ field.label_tag }} {{ field }}
{% endfor %}
<br>
{% endfor %}
<input type="submit" value="Aggiungi">
</form>
. Когда он рендерит, автоматически добавляется поле с записью 'Human ptr:' (потому что моя модель, Player, является подклассом Human ..., еслиЯ использую непосредственно человека, он показывает мне 'Id:' , заголовок просто для обобщения проблемы).
Как я могу удалить эту запись?Я попытался:
1) использовать в html-файле тег {% forloop.last%} , но на самом деле последним полем является 'Удалить:' флажок (еслиЯ использую can_delete = False это работает, но мне это нужно)
2) изменить метку в метаданных PlayerForm (ModelForm), но, похоже, не работает для этого поля.Странно, что вместо этого работает widgets = {'human_ptr': Input (attrs = {})} , но это влияет на {{{field}} , а не на {{поле.label_tag}}
Если это может быть полезно, я добавляю все части кода:
forms.py
from skeleton.models import Player
from django.forms import ModelForm
from django.forms.widgets import Input
class PlayerForm(ModelForm):
class Meta:
model = Player
fields = ['first_name', 'last_name', 'jersey_number']
labels = {
'first_name': 'Nome',
'last_name': '',
'jersey_number': 'Numero di maglia',
'human_ptr': 'human_ptr', }
# widgets = {'human_ptr': Input(attrs={})}
views.py
from django.shortcuts import render, redirect
from skeleton.models import Player
from django.contrib.auth.decorators import login_required
from .forms import PlayerForm
from django.forms import modelformset_factory
from django.http import HttpResponseNotFound
# Create your views here.
@login_required(login_url="/accounts/login/")
def team_area(request):
if request.user.team is not None:
PlayerFormSet = modelformset_factory(Player, form=PlayerForm, extra=1, can_delete=True,)
if request.method == "POST":
player_formset = PlayerFormSet(
request.POST,
request.FILES,
queryset=Player.objects.all().filter(team=request.user.team),)
for player_form in player_formset:
if player_form.is_valid():
player = player_form.save(commit=False)
player.team = request.user.team
if player_formset.is_valid():
player_formset.save()
return redirect('team_area:home')
else:
player_formset = PlayerFormSet(queryset=Player.objects.all().filter(team=request.user.team))
return render(request, 'team_area/team_area.html', {'player_formset': player_formset})
else:
return render(request, 'team_area/empty_page.html')
models.py
class Human(models.Model):
SHIRT_SIZES = (('XXS', 'XXS'), ('XS', 'XS'), ('S', 'S'), ('M', 'M'), ('L', 'L'), ('XL', 'XL'), ('XXL', 'XXL'))
team = models.ForeignKey(Team, on_delete=models.CASCADE)
first_name = models.CharField(max_length=16)
last_name = models.CharField(max_length=16)
jersey_size = models.CharField(max_length=4, choices=SHIRT_SIZES, blank=True)
slug = models.SlugField(blank=True)
def save(self, *args, **kwargs):
self.slug = slugify(self.first_name + ' ' + self.last_name)
super(Human, self).save(*args, **kwargs)
def __str__(self):
return self.first_name + ' ' + self.last_name
class Player(Human):
year_of_birth = models.IntegerField(validators=[MinValueValidator(1900), MaxValueValidator(2100)], blank=True, null=True)
jersey_number = models.IntegerField(validators=[MinValueValidator(0), MaxValueValidator(99)], blank=True, null=True)
all_star_game = models.ForeignKey(AllStarGame, on_delete=models.CASCADE, blank=True, null=True)
Возможно, я бы хотел изменить форму напрямую ( views.py ), а не то, как я ее отображаю ( team_area.html ).