如何使用 html 表单更新基于 django 模型的表单(具有选择选项)记录

Posted

技术标签:

【中文标题】如何使用 html 表单更新基于 django 模型的表单(具有选择选项)记录【英文标题】:How to update django model based form(having choices option) records by using html form 【发布时间】:2021-01-10 07:08:37 【问题描述】:

我正在尝试更新我预先存在的模型**(ShiftChange)**,并以基于模型的形式使用了 CHOICES,如下所示。

 from django.db import models
        
     ======
=============
        )
        class ShiftChange(models.Model):
            ldap_id = models.CharField(max_length=64)
            Vendor_Company = models.CharField(max_length=64,choices=VENDOR_CHOICES,default='genesys')
            EmailID =  models.EmailField(max_length=64,unique=True)
            Shift_timing = models.CharField(max_length=64,choices=SHIFT_CHOICES,default='General_Shift')
            Reason = models.TextField(max_length=256)
            # updated_time = models.DateTimeField(auto_now=True)

更新我使用基于 html 的表单,因为我想向最终用户显示内容(最终用户将单击更新按钮,如果他愿意,他可以通过选择下拉按钮更改值)。 我已经实现了创建、检索和删除视图,它工作正常,但更新操作不起作用。请找到我正在使用的 html 代码。 update.html

<p>User information Update Form</p>
    <!--        <h5><span3>Note:</span3> For timing please use this format e.g 1.Morning Shift = <span2>6.30-3.30</span2> <br>2.Second Shift= <span1>3.30-12.30</span1><br>3.general Shift =<span4>9.00-6.00</span4></h5>-->
            <form method="post" class="post-form">
   
    
                %csrf_token%
    
                Ldap ID: <input type="text" name="ldap_id" value="oneuser.ldap_id"><br><br>
                Email ID: <input type="email" name="EmailID" value="oneuser.EmailID"><br><br>

                Company Name:<select name="Vendor_Company"
                <option value="oneuser.Vendor_Company">Genesys</option>
                <option value="oneuser.Vendor_Company">RMSI</option>
                <option value="oneuser.Vendor_Company">TCS</option>
                <option value="oneuser.Vendor_Company">Cognizant</option>
                <option value="oneuser.Vendor_Company">CTS</option></form></select>
                <br><br>
                Shift Timing:<select name="Shift_timing" choices=VENDOR_CHOICES

                <option value="oneuser.Shift_timing">9.00-6.00</option>
            <option value="oneuser.Shift_timing">6.30-3.30</option>
                <option value="oneuser.Shift_timing">12.30-3.30</option></div></select>
                <br><br>
    <!--            Shift Timing: <input type="text" name="Shift_timing" value="oneuser.Shift_timing"><br><br>-->
                Reason/justification for Change: <input type="textarea" name="Reason" value="oneuser.Reason"><br><br>
                <input type="submit" name="" value="Update Detail">
    
            </form>
        </div>
    </div>

当我将光标移到更新按钮上时,我可以看到它显示了正确的 url,但是在从下拉选项更改一些字段后单击提交时,它会重定向到目标页面,但更改未反映在 db 中。

我认为这个问题是因为在模型中实现了 CHOICES 选项,因为没有选择(下拉)它工作正常。

还想知道是否有任何方法可以通过使用基于模型的表单而不是 html 来完成此操作(但问题是如果我们使用模型表单如何显示内容)。

我的views.py代码

def update_view(request,id):
        oneuser=ShiftChange.objects.get(id=id)
        if request.method == "POST":
            form=ShiftChangeForm(request.POST,instance=oneuser)
            if form.is_valid():
                form.save(commit=True)
                return HttpResponseRedirect('/alldata')
        return render(request,'apple/update.html','oneuser':oneuser)

urls.py

url(r'^update/(?P<id>\d+)/$', views.update_view),

【问题讨论】:

【参考方案1】:

你可以通过这样做给网址命名吗:

url(r'^update/(?P<id>\d+)/$', views.update_view, name='update_shift'),

然后在您的模板中,您必须在表单标签的 action 属性中提供该 URL NAME,以便表单根据需要点击更新 url,如下所示:

<form method="post" class="post-form" action="% url 'update_shift' oneuser.ldap_id %">

然后您可以在视图中打印表单以查看如下内容:

print(form)

Refer this django documentation for providing form URL in actions:

在这里您可以执行保存。如果您不使用模型表单,则必须手动从表单中获取数据,然后像这样保存。

And refer this *** for saving to db without using model form

【讨论】:

Hi Abhi.Thanks 你能否让我知道上面代码中的错误,因为我检查并发现 url 正在重定向,当我插入 SHIFT_CHOICES = ( ('9.00-6.00' ,'9.0-6.0'), ('6.30-3.30', '6.30-3.30'), ('12.30-3.30','12.30-3.30'), VENDOR_CHOICES = (('genesys','Genesys'), ( 'rmsi', 'RMSI'), ('tcs','TCS'), ('Cognizant', 'Cognizant'), ('CTS', 'CTS.') ) 所以我想知道错误是什么还有其他方法可以从 db 读取记录并获取模型中的选项(选择)。

以上是关于如何使用 html 表单更新基于 django 模型的表单(具有选择选项)记录的主要内容,如果未能解决你的问题,请参考以下文章

仅在 django 中创建基于更新类的视图时,为我的文件上传使用表单集不起作用

Django 在基于类的视图中处理多个表单

Django:在基于类的视图中包含媒体(css/js)

基于下拉值选择显示Django ModelForm中的链接

基于 Django 类的视图 - 具有两个模型表单的 UpdateView - 一个提交

如何在Django中只在ModelForms表中正确提交一个表单?