Python Django外键表单字段在模板中呈现
我想为多个对象删除创建一个视图。为此,我想我可以使用Python Django外键表单字段在模板中呈现,python,django,forms,foreign-keys,Python,Django,Forms,Foreign Keys,我想为多个对象删除创建一个视图。为此,我想我可以使用modelformset\u工厂 这是我的模型: class Item(models.Model): rfid_tag = models.CharField() asset = models.OneToOneField('Assets', default=None, null=True, on_delete=models.SET_DE
modelformset\u工厂
这是我的模型:
class Item(models.Model):
rfid_tag = models.CharField()
asset = models.OneToOneField('Assets', default=None, null=True,
on_delete=models.SET_DEFAULT,)
date = models.DateTimeField(name='timestamp',
auto_now_add=True,)
...
class Assets(models.Model):
id = models.AutoField(db_column='Id', primary_key=True)
assettag = models.CharField(db_column='AssetTag', unique=True, max_length=10)
assettype = models.CharField(db_column='AssetType', max_length=150)
...
class Meta:
managed = False
db_table = 'Assets'
ordering = ['assettag']
def __str__(self):
return f"{self.assettag}"
def __unicode__(self):
return f"{self.assettag}"
以下是表单和表单集工厂:
class ItemDelete(forms.ModelForm):
asset = forms.CharField(required=True,
help_text= "Item asset tag",
max_length=16,
)
delete = forms.BooleanField(required=False,
label="Delete",
help_text='Check this box to delete the corresponding item',
)
class Meta:
model = Item
fields = ['asset']
ItemDeleteMultiple= forms.modelformset_factory(model=Item,
form=ItemDelete,
extra=0,
)
观点:
class DeleteMultipleView(generic.FormView):
template_name = *some html file*
form_class = ItemDeleteMultiple
success_url = *some url*
def form_valid(self, form):
return super().form_valid(form)
以及模板:
{% extends "pages/base.html" %}
{% block title %}
<title>Delete Multiple</title>
{% endblock %}
{% block static %}
{% load static %}
{% endblock %}
{% block content %}
<h1>Delete Multiple Items</h1>
<form class="item_delete_multiple_form" action ="." method="POST"> {% csrf_token %}
<table border="2">
<tr><th colspan="3" scope="row">Select Items to Delete</th></tr>
{% for item_form in form %}
<tr>
{% if item_form.non_field_errors %}
<td>{{ item_form.non_field_errors }}</td>
{% endif %}
{% if item_form.asset.errors %}
<td>{{item_form.asset.errors}}</td>
{% endif %}
<td><label for="{{ item_form.asset.id_for_label }}">AssetTag {{forloop.counter}}:</label></td>
<td>{{item_form.asset}}</td>
{% if item_form.delete.errors %}
<td>{{item_form.delete.errors}}</td>
{% endif %}
<td>{{item_form.delete}}</td>
</tr>
{% endfor %}
</table>
</form>
{% endblock %}
{% block script %}
{% endblock %}
{%extends“pages/base.html”%}
{%block title%}
删除多个
{%endblock%}
{%block static%}
{%load static%}
{%endblock%}
{%block content%}
删除多个项目
{%csrf_令牌%}
选择要删除的项目
{表格%中的项目形式为%u}
{%if item_form.non_field_errors%}
{{item_form.non_field_errors}}
{%endif%}
{%if item_form.asset.errors%}
{{item_form.asset.errors}
{%endif%}
AssetTag{{forloop.counter}}:
{{item_form.asset}
{%if item_form.delete.errors%}
{{item_form.delete.errors}
{%endif%}
{{item_form.delete}
{%endfor%}
{%endblock%}
{%block script%}
{%endblock%}
模板不太容易看到,所以这里是重要的部分:{{{item\u form.asset}
问题如下:
如果我没有在ItemDelete
表单中添加asset=CharField()
部分,模板将在选项字段中呈现Assets
模型的\uuuuu str\uuuu/\uuuuuu unicode\uu>方法将返回的内容(assettag字段)
如果资产字段是表单中的CharField
,则模板将呈现资产的id
。项
表中的数据库项
我想在CharField(只读文本输入)中呈现asset.assettag
。有可能这样做吗
还是有更好的方法来实现多重删除操作,使用对象列表和复选框?我找到了以下解决方案:
class ItemDelete(forms.ModelForm):
asset = forms.CharField(required=True,
help_text= "Item asset tag",
max_length=16,
disabled=True,
)
delete = forms.BooleanField(required=False,
label="Delete",
help_text='Check this box to delete the corresponding item',
)
def __init__(self, *args, **kwargs):
super(ItemDelete,self).__init__(*args, **kwargs)
self.initial['asset'] = Assets.objects.get(id=self.initial['asset']).assettag
class Meta:
model = Item
fields = ['asset']
鉴于输入字段仅用于演示目的(已禁用且无法编辑),我认为它可以。缺点是它会影响每个对象的数据库(作为一个表单集,每个对象都有自己的表单)
我仍然愿意接受更好的建议