如何在 django-tables2 中为 ID 字段添加隐藏输入?

How to add hidden input for ID field inside django-tables2?

我正在使用 Django-tables2 呈现一个 table,它的表单标签包裹在 table 周围,以保存修改后的行顺序数据。我需要让 table 在表单标签内呈现以下隐藏输入,以便我的表单可以保存修改后的数据。

<input type="hidden" name="id" value="{{ track.id }}">

该解决方案有效,但它目前在 td 标签内呈现输入标签,这使其显示 ID 列。如何在隐藏输入标签的同时隐藏 ID 列?

<td class="id">20098<input type="hidden" name="track_id" value="20098" /></td>

tables.py:

class TrackIDColumn(tables.Column):

    def render(self, value):
        return mark_safe(str(value) + '<input type="hidden" name="track_id" value="' + str(value) + '" />')

class PlaylistTable(tables.Table):

    id = TrackIDColumn()

    class Meta:
        model = Track
        attrs = {"class": "paleblue"}
        orderable = False
        fields = ('id', 'artist', 'title',)

模板:

<form method='POST' action='{% url "playlists:save_playlist" username=user.get_username slug=playlist.slug %}'>{% csrf_token %}
{% render_table table "django_tables2/bootstrap.html" %}
<button type="submit" name="playlist_id" value="{{ playlist.id }}" class="btn btn-primary">Save</button>
</form>

您不能在不渲染列的情况下在列中渲染某些内容。您可以做的是通过在列上添加一个空 verbose_name 来隐藏 header:

class PlaylistTable(tables.Table):
    id = tables.Column(verbose_name='')

    def render_id(self, value):
        return format_html('<input type="hidden" name="track_id" value="{}" />', str(value))

如果您绝对不希望呈现额外的列,则必须将隐藏的输入标签添加到另一列:

class PlaylistTable(tables.Table):
    artist = tables.Column()
    title = tables.Column()

    def render_title(self, value, record):
        return format_html('{} <input type="hidden" name="track_id" value="{}" />', value, record.id)