Python 如何在表单中显示只读唯一id?

Python 如何在表单中显示只读唯一id?,python,django-models,django-forms,django-views,django-templates,Python,Django Models,Django Forms,Django Views,Django Templates,我目前有一个叫做服务的模型,如图所示 class Services(models.Model): service_sku = models.AutoField(primary_key=True) name = models.CharField(max_length=200, null=True) price = models.FloatField(null=True) forms.py class ServiceForm(forms.ModelForm):

我目前有一个叫做服务的模型,如图所示

class Services(models.Model):

    service_sku = models.AutoField(primary_key=True)
    name = models.CharField(max_length=200, null=True)
    price = models.FloatField(null=True)

forms.py

class ServiceForm(forms.ModelForm):

    class Meta:
        model = Services
        fields = '__all__'

基于上面显示的代码,我有两个视图,一个视图将创建上面模型的实例,另一个视图将更新实例,如下所示

def NewServices(request):
    form = ServiceForm()
    if request.method == 'POST':
        form = ServiceForm(request.POST or None)
        if form.is_valid():
            form.save()
            return redirect('/')
    return render(request, 'accounts/new_services.html', {'form': form})


def EditServices(request,pk):


    service = Services.objects.get(service_sku=pk)
    form = ServiceForm(instance=service)
    if request.method == 'POST':
        form = ServiceForm(request.POST, instance=service)
        if form.is_valid():
            form.save()
            return redirect('/')

    context = {'form':form}
    return render(request, 'accounts/edit_services.html',context)

<div class="row">
    <div class="col-md-7">
        <div class="card card-body">
            <form action="" method="POST">
                {% csrf_token %}
                {{form}}
                <hr>
                <input type="submit" name="Update">
            </form>
        </div>
    </div>
</div>

模板如下

def NewServices(request):
    form = ServiceForm()
    if request.method == 'POST':
        form = ServiceForm(request.POST or None)
        if form.is_valid():
            form.save()
            return redirect('/')
    return render(request, 'accounts/new_services.html', {'form': form})


def EditServices(request,pk):


    service = Services.objects.get(service_sku=pk)
    form = ServiceForm(instance=service)
    if request.method == 'POST':
        form = ServiceForm(request.POST, instance=service)
        if form.is_valid():
            form.save()
            return redirect('/')

    context = {'form':form}
    return render(request, 'accounts/edit_services.html',context)

<div class="row">
    <div class="col-md-7">
        <div class="card card-body">
            <form action="" method="POST">
                {% csrf_token %}
                {{form}}
                <hr>
                <input type="submit" name="Update">
            </form>
        </div>
    </div>
</div>


{%csrf_令牌%}
{{form}}


当需要更新实例时,以及当创建实例时在模板中显示为自动生成服务sku readonly时,是否可以在我的模板表单中显示内的服务sku readonly

。您可以在表单中包含该字段,因此可能需要单独创建一个字段进行更新:

class ServiceEditForm(forms.ModelForm):
    service_sku = forms.IntegerField(disabled=True)

    class Meta:
        model = Services
        fields = ('service_sku', 'name', 'price')
类ServiceEditForm(forms.ModelForm):
服务\u sku=forms.IntegerField(disabled=True)
类元:
模型=服务
字段=('service\u sku'、'name'、'price')
在表单中,您只需使用新表单:

def EditServices(request,pk):
    service = Services.objects.get(service_sku=pk)
    if request.method == 'POST':
        form = ServiceEditForm(request.POST, request.FILES, instance=service)
        if form.is_valid():
            form.save()
            return redirect('/')
    else:
        form = ServiceEditForm(instance=service)
    context = {'form':form}
    return render(request, 'accounts/edit_services.html', context)
def EditServices(请求,主键):
service=Services.objects.get(service\u sku=pk)
如果request.method==“POST”:
form=ServiceEditForm(request.POST、request.FILES、instance=service)
如果form.is_有效():
form.save()
返回重定向(“/”)
其他:
表单=服务编辑表单(实例=服务)
上下文={'form':form}
返回渲染(请求“accounts/edit_services.html”,上下文)

使用不仅可以确保该字段在客户端被禁用,还可以防止用户发出恶意的POST请求。

谢谢,但当我必须创建实例时,它会要求填写该字段。我只想让它生成一个新的a服务sku(pk)。有办法吗?@小悟空:但在创建记录之前,还没有主键。这是在记录成功时生成的。显然,您可以通过表单元素传递id,但是“黑客”可以发出恶意的POST请求来更改pk。我明白了,所以我只能允许仅在更新实例时显示主键。@小悟空:但在您发出成功的POST请求之前,没有主键。通常,这是由数据库“分发”的。