【问题标题】:How to show read only unique id in form?如何在表单中显示只读唯一ID?
【发布时间】:2020-09-29 02:25:35
【问题描述】:

我目前有一个称为服务的模型,如下所示...

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>

是否可以在我的模板表单中显示 service_sku 的 readyonly,当需要更新实例时以及在创建实例时在模板中显示 service_sku readonly 时自动生成?

【问题讨论】:

    标签: python django-models django-forms django-views django-templates


    【解决方案1】:

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

    class ServiceEditForm(forms.ModelForm):
        service_sku = forms.IntegerField(disabled=True)
    
        class Meta:
            model = Services
            fields = ('service_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)

    使用disabled=True [Django-doc] 不仅可以确保在客户端禁用该字段,还可以防止有人发出恶意的 POST 请求。

    【讨论】:

    • 谢谢,但是当我必须创建实例时它要求填写该字段。我只是想让它生成一个新的 service_sku (pk)。有没有办法做到这一点?
    • @goku:但是在构造记录之前,还没有没有个主键。这是在记录成功时生成的。您显然可以通过表单元素传递 id,但随后“黑客”可以发出恶意 POST 请求来更改 pk。
    • 我明白了,所以我只能在仅更新实例时允许显示主键。
    • @goku: 但是在你发出一个成功的 POST 请求之前,有 no 主键。通常这是由数据库“分发”的。
    猜你喜欢
    • 2023-01-30
    • 2011-03-19
    • 2011-08-20
    • 1970-01-01
    • 1970-01-01
    • 2020-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多