OP'nin sorusuyla neredeyse aynı olan bir şey yapmak istedim (tablo ve hepsi), aynı şekilde Django'nun işbirliği eksikliği yüzünden hayal kırıklığına uğramıştı ve benzer şekilde kendi uygulamamla başa çıkmak için kaynağa düştüler. Geldiğim şey kabul edilen cevaptan biraz farklı ve ben de daha iyi beğendim çünkü şablonumda basit bir {{ form.as_table }}
kullanıyordum ve visible_fields
arasında döngü yapmak zorunda kalmak istemedim veya gereksiz yere bir radyo düğmesi Sadece Django'nun mevcut uygulamasına benzeyen şablon (bu değişebilir). İşte bunun yerine did:
RadioInput ve RadioFieldRenderer
Django'nın RadioSelect
Widget radyo düğmeleri render asıl işi olan bir generatorRadioInputs
ait verim RadioFieldRenderer
kullanır. RadioSelect
, belgesini, bu varsayılandan farklı bir oluşturucuya aktarabileceğiniz belgelenmemiş bir özelliğe sahip gibi görünüyor; böylece OP'nin istediği şeyi almak için bunların alt sınıflarını da alt sınıflara ayırabilirsiniz.
...
radio = forms.ChoiceField(widget=forms.RadioSelect(renderer=CustomTableFieldRenderer),
choices=...)
...
Ve işte bu kadar:
Ile bitmiş
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)
, biz sadece bizim formu kodunda yere istediğim zaman bizim özel oluşturucuyu kullanmak RadioSelect
widget'ı anlatmak gerekiyor!Bu yerine
<table>
<tbody>
{% for tr in form.radio %}
<tr>{{ tr }}</tr>
{% endfor %}
</tbody>
</table>
:
, muhtemelen bu yani oldukça doğrudan çağırmaktan daha alanın üzerine döngü isteyeceksiniz o şablonda kullanmak için dikkat edin
<table>
<tbody>{{ form.radio }}</tbody>
</table>
İkincisini yaparsanız, tablo öğelerinizi <ul><li>...</li></ul>
içine sarmayı deneyecektir.
Merhaba, Bunu yazdıysam ** {{field.name}} ** sonra alanların tüm adlarını yazdırır, ancak eğer '{% if field.name = "öznitelikleri"%} "durumunda kullanılırsa ya da '{% field.name = attributes%}' ise ve bu durumun başarısı üzerine bir şeyler yazdırmaya çalışın, sonra hiçbir şey yazdırmaz, koşulun false değerini döndürdüğü anlamına gelir. Ama bu durumda kullandığım alan adı yazdırdığıdır. ** NEDEN? ** – Inforian
Tek biriniz var = = olmalı == –