Как я могу не отображать «Id:» при отображении формы?(так же, как 'ParentClass ptr:') - PullRequest
0 голосов
/ 28 декабря 2018

Я сделал форму (фактически 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 ).

Ответы [ 2 ]

0 голосов
/ 29 декабря 2018

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

  {% for field in player_form %}
    {% if forloop.revcounter != 2 %}
      {{ field.label_tag }} {{ field }}
    {% else %}
      {{ field }}
    {% endif %}
  {% endfor %}
0 голосов
/ 28 декабря 2018

Это не красиво, но работает

 {% for field in player_form %}
     {% if field.label_tag != id %}
         {{ field.label_tag }} {{ field }}
     {% endif %}
 {% endfor %}
...