Python 如何在Django表单中创建用户无法编辑的只读字段?
我正在尝试用python django创建我自己的第一个项目。到目前为止,我所做的只是一个简单的商店。 单击此按钮时: item_details.htmlPython 如何在Django表单中创建用户无法编辑的只读字段?,python,django,forms,readonly,disable,Python,Django,Forms,Readonly,Disable,我正在尝试用python django创建我自己的第一个项目。到目前为止,我所做的只是一个简单的商店。 单击此按钮时: item_details.html <a href="{% url 'buy_item' pk=item.pk %}" class="submit">Kup teraz</a> 基于这一观点: views.py class ItemCreate(CreateView): 型号=订单 字段=['项目','价格','买方','交货'] def get_首字
<a href="{% url 'buy_item' pk=item.pk %}" class="submit">Kup teraz</a>
基于这一观点:
views.py
class ItemCreate(CreateView):
型号=订单
字段=['项目','价格','买方','交货']
def get_首字母(自身):
item=获取对象或404(item,pk=self.kwargs['pk'])
self.initial.update({
“买方”:self.request.user,
“价格”:item.price,
“item”:item.pk,
})
返回super(ItemCreate,self).get_initial()
models.py
因为初始数据不应由用户编辑,所以我希望将其设置为只读
到目前为止,我尝试的是:
class BuyForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
super(BuyForm, self).__init__(*args, **kwargs)
self.fields['buyer'].widget.attrs['readonly'] = True
class Meta:
model = Order
fields = (
'item',
'delivery',
'price',
'buyer',)
我的控制台中没有错误,但也没有结果
My order_form.html看起来是:
{% extends 'shop/base.html' %}
{% block content %}
<div align="center">
<h1>Buy item</h1>
<form method="POST" class="post-form">{% csrf_token %}
{{ form.as_p }}
<button type="submit" class="save btn btn-default">Buy</button>
</form>
</div>
<
{% endblock %}
{%extends'shop/base.html%}
{%block content%}
购买物品
{%csrf_令牌%}
{{form.as_p}}
购买
<
{%endblock%}
我该怎么做才能使“买家”、“价格”和“商品”成为只读?试试这个:
class BuyForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
super(BuyForm, self).__init__(*args, **kwargs)
self.fields['buyer'].required = False
self.fields['buyer'].widget.attrs['disabled'] = "disabled"
...
def clean_buyer(self):
instance = getattr(self, 'instance', None)
if instance:
return instance.buyer
else:
return self.cleaned_data.get('buyer', None)
但是禁用attr的字段将发布
空白的数据。这就是为什么我们重写clean
方法,将字段的值设置为实例中最初的值。您要查找的是formfield的已禁用的属性:
所有其他答案都很好且正确,但在我创建您的示例时,这并没有解决问题
实际的问题是您的视图从一开始就不使用表单——这就是为什么覆盖属性什么都不做
有关使用自定义表单的基于类的视图的详细信息,请参见
views.py
从django.shortcuts导入get\u object\u或\u 404
从django.views.generic导入CreateView
from.models导入项
from.forms导入BuyForm
类ItemCreate(CreateView):
form_class=BuyForm
模板名称='order\u form.html'
成功_url='/Thank/'
def get_首字母(自身):
item=获取对象或404(item,pk=self.kwargs['pk'])
self.initial.update({
“买方”:self.request.user.id,
“价格”:item.price,
“item”:item.pk,
})
返回super(ItemCreate,self).get_initial()
forms.py
来自django导入表单的
从。模型进口订单
类BuyForm(forms.ModelForm):
定义初始化(self,*args,**kwargs):
超级(买形式,自我)。\uuuuu初始值(*args,**kwargs)
self.fields['buyer'].disabled=True
类元:
型号=订单
字段=(
“项目”,
“交付”,
"价格",,
‘买方’,)
另一种方法是将它们设为隐藏字段。将此添加到元
class Meta:
widgets = {
'buyer': forms.HiddenInput(),
'price': forms.HiddenInput(),
'item': forms.HiddenInput(),
}
没有结果也没有错误。我仍然可以编辑初始数据。顺便说一下,我想创建一个只读字段。我如何读取隐藏的输入?尽管使用了clean函数,但它会发布空白数据。字段被禁用,但它显示“选择有效的选项。该选项不是可用的选项之一。”并且我无法提交订单。@Eliro您需要以首字母形式提供user.id
,而不仅仅是user
。我更新了我的答案。
class Meta:
widgets = {
'buyer': forms.HiddenInput(),
'price': forms.HiddenInput(),
'item': forms.HiddenInput(),
}