Ich wollte etwas tun fast identisch mit OP-Frage (Tabelle und alle), war in ähnlicher Weise frustriert von Django mangelnde Zusammenarbeit, und endete ähnlich in die Quelle eintauchen, um mit meiner eigenen Umsetzung zu kommen. Was ich herausgefunden habe, ist ein bisschen anders als die angenommene Antwort, und ich mochte es besser, weil ich eine einfache {{ form.as_table }}
in meiner Vorlage verwendete und nicht unnötig durch visible_fields
durchschleifen oder einen Radioknopf in meinem Code fest codieren wollte Vorlage, die lediglich Djangos aktueller Implementierung ähnelt (was sich ändern könnte). Hier ist, was ich tat, statt:
RadioInput und RadioFieldRenderer
Djangos RadioSelect
Widget verwendet RadioFieldRenderer
eine generator von RadioInputs
zu ergeben, was tun die eigentliche Arbeit der Radio-Buttons machen. RadioSelect
scheint eine undokumentierte Funktion zu haben, durch die Sie einen anderen Renderer als diesen Standard übergeben können, so dass Sie beide unterteilen können, um das zu erhalten, was OP will.
from django import forms
from django.utils.safestring import mark_safe
class CustomTableRadioInput(forms.widgets.RadioInput):
# We can override the render method to display our table rows
def render(self, *args, **kwargs):
# default_html will hold the normally rendered radio button
# which we can then use somewhere in our table
default_html = super(CustomTableRadioInput, self).render(*args, **kwargs)
# Do whatever you want to the input, then return it, remembering to use
# either django.utils.safestring.mark_safe or django.utils.html.format_html
# ...
return mark_safe(new_html)
class CustomTableFieldRenderer(forms.widget.RadioFieldRenderer):
# Here we just need to override the two methods that yield RadioInputs
# and make them yield our custom subclass instead
def __iter__(self):
for i, choice in enumerate(self.choices):
yield CustomTableRadioInput(self.name, self.value,
self.attrs.copy(), choice, i)
def __getitem__(self, idx):
choice = self.choices[idx] # Let the IndexError propogate
return CustomTableRadioInput(self.name, self.value,
self.attrs.copy(), choice, idx)
Wenn das getan ist, wir müssen nur das RadioSelect
Widget sagen, unsere eigene Renderer zu verwenden, wann immer wir es irgendwo in unserem Formular-Code aufrufen:
...
radio = forms.ChoiceField(widget=forms.RadioSelect(renderer=CustomTableFieldRenderer),
choices=...)
...
Und das ist es!
Sie beachten Sie, dass dies in der Vorlage zu verwenden, werden Sie wahrscheinlich über das Feld Schleife wollen, anstatt sie direkt aufrufen, das heißt das:
<table>
<tbody>
{% for tr in form.radio %}
<tr>{{ tr }}</tr>
{% endfor %}
</tbody>
</table>
eher als das:
<table>
<tbody>{{ form.radio }}</tbody>
</table>
Wenn Sie das letztere tun, wird es versuchen, Ihre Tabellenelemente in <ul><li>...</li></ul>
zu verpacken.
Hi, wenn ich dieses ** {{field.name}} ** drucke, dann druckt es alle Namen der Felder, aber wenn ich es in der Bedingung '{% if field.name =" attributes "%}' oder '{% if field.name = attributes%}' und versuche, etwas auf den Erfolg dieser Bedingung zu drucken, dann druckt nichts, dh die Bedingung gibt false zurück. Aber der Feldname, den ich in diesem Zustand benutzte, ist ein Ausdruck, den er druckt. ** WARUM SO ?? ** – Inforian
Sie haben eine einzige = es sollte == sein –