【问题标题】:How can I not display 'Id:' when I render my form? (same as 'ParentClass ptr:')渲染表单时如何不显示“Id:”? (与 'ParentClass ptr:' 相同)
【发布时间】:2019-05-26 11:49:23
【问题描述】:

我已经用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 %} 但实际上最后一个字段是 'Delete:' 复选框(如果我使用 can_delete=False 可以,但我需要)

2) 在 PlayerForm(ModelForm) Meta 中更改标签,但似乎不适用于该字段。奇怪的是,widgets = {'human_ptr': Input(attrs={})} 但它影响 {{ field }} 而不是 {{ 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)。

【问题讨论】:

    标签: python django django-models django-forms django-templates


    【解决方案1】:

    它不漂亮,但它有效

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

    【讨论】:

    • 如果这可以帮助你,我也试过field.field.label_tag != id,结果相反,没有显示
    • 我认为是一样的,如果我找到了一个的解决方案,我也解决了另一个
    【解决方案2】:

    我在我的 html 文件中做了这个并且工作了。我必须添加 else,因为没有表单将无法正常工作

      {% for field in player_form %}
        {% if forloop.revcounter != 2 %}
          {{ field.label_tag }} {{ field }}
        {% else %}
          {{ field }}
        {% endif %}
      {% endfor %}
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-07-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多