Python 如何在Django表单中创建用户无法编辑的只读字段?

Python 如何在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_首字

我正在尝试用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_首字母(自身):
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(),
    }