嘿 我正在使用模型formset让我的用户编辑他们的相册。我想在每张照片上放置一个Radio选择框,说“Set as cover image”,这样我就可以处理所有照片并找到应该是专辑封面的照片。问题是我如何使用无线电选择一个字段到formset并仍然保持与其余照片的mutal?这是我目前的代码:
class ProjectGalleryForm(forms.ModelForm):
remove_photo = forms.BooleanField()
# set_as_cover_image = .... ?? <-- what to put?
class Meta:
model = Photo
exclude = (
'effect',
'caption',
'title_slug',
'crop_from',
'is_public',
'slug',
'tags'
)
答案 0 :(得分:3)
我认为这里的关键是单选按钮实际上不是formset的一部分:它是父表单的一部分。这是实际的相册模型,需要知道哪些Photo对象是封面图像。所以你想要做的是从单选按钮旁边显示每个选项以及Photo formset中相应的行 - 这是棘手的一点,因为Django无法以这种方式呈现表单字段。您需要手动为每个选项生成HTML。
因此,给定这些表单,并假设Album模型有一个cover_image
,它是OneToOneField to Photo:
class AlbumForm(forms.modelForm):
class Meta:
model = Album
photo_formset = forms.inlineformset_factory(Album, Photo, form=ProjectGalleryForm)
在模板中你会做类似的事情:
{% for photo_form in photo_formset %}
<tr><td>
{% if photo_form.instance.pk %}
<input type="radio" id="id_cover_image_{{ forloop.counter }}" name="cover_image" value="{{ photo_form.instance.pk }}">
<label for="id_cover_image_{{ forloop.counter }}">Use as cover image</label>
{% endif %>
</td><td>{{ photo_form.as_p }}</td>
</tr>
{% endfor %}
答案 1 :(得分:1)
我喜欢拥有一个整洁的模板文件,因此,我为此目的制作了一个自定义小部件。
class SingleRadioInput(Input):
input_type = 'radio'
def render(self, value, checked, attrs=None):
output = []
if value:
is_cover = ''
if checked : is_cover = 'checked'
output.append(
('<input type="radio" name="inline" value="%s" %s/>')
% (value, is_cover)
)
return mark_safe(u''.join(output))
希望它可以帮助某人
答案 2 :(得分:0)
根据@Mikou的回答,这是我更全面的解决方案。
为了让我的模板保持干净漂亮,我使用了自定义小部件
class SingleRadioInput(forms.widgets.Input):
input_type = 'radio'
def render(self, name, value, attrs=None):
final_attrs = self.build_attrs(attrs, type=self.input_type)
output = []
if name:
is_checked = ''
if value:
is_checked = 'checked'
output.append(
('<input id="%s" type="radio" name="%s" value="%s" %s/>')
% (final_attrs['id'], final_attrs['name'], final_attrs['instance_id'], is_checked )
)
return mark_safe(u''.join(output))
我的对象形式如下所示,如果字段为default == True
class ObjectForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
super(ObjectForm, self).__init__(*args, **kwargs)
self.fields['default'].widget.attrs.update({'instance_id': self.instance.id, 'name': 'default'})
if self.instance.default:
self.fields['default'].widget.attrs.update({'value': True})
class Meta:
model = MyModel
fields = ['default']
widgets = {
'default': SingleRadioInput(),
}
这是我的formset
ProductReferenceFormset = inlineformset_factory(ParentModel, MyModel,
form=ObjectForm,
extra=0, can_delete=False, can_order=False)
我放弃了处理表单中的保存部分,我觉得这种复杂性真的不值得......所以保存部分位于form_valid()
View
def form_valid(self, form, price_form):
form.save()
# save the default radio
MyModel.objects.filter(parent=self.object).update(default=False)
MyModel.objects.filter(id=self.request.POST.get('default')).update(default=True)
return HttpResponseRedirect(self.get_success_url())
答案 3 :(得分:0)
资格:
<option value='10th' {% if '10th' in i.qf %} selected='select' {% endif %}>10th</option>
<option value='12th' {% if '12th' in i.qf %} selected='select' {% endif %}>12th</option>
<option value='graduted' {% if 'Graduated' in i.qf %} selected='select' {% endif %}>Graduated</option>
</select>
<br><br>