首页 > 解决方案 > 渲染表单时如何不显示“Id:”?(与 'ParentClass ptr:' 相同)

问题描述

我用modelformset_factory制作了一个表格(实际上是Formset)。和一起表示

  <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 的子类......如果我直接使用 Human,他会向我显示'Id:',标题只是为了概括问题)。

我怎样才能删除这个写?我试过了:

1)在 html 文件中使用标签{% forloop.last %}但实际上最后一个字段是“删除:”复选框(如果我使用can_delete=False它可以工作,但我需要它)

2) 在 PlayerForm(ModelForm) Meta 中更改标签,但似乎不适用于该字段。奇怪的是,widgets = {'human_ptr': Input(attrs={})}但它会影响{{ field }}而不是{{ field.label_tag }}

如果有用,我会添加相关代码的所有部分:

表格.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={})}

视图.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')

模型.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)。

标签: pythondjangodjango-modelsdjango-formsdjango-templates

解决方案


它不漂亮,但它有效

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

推荐阅读