Django使用Pyodbc的MSSQL:模型表单没有被保存

时间:2016-12-13 16:27:30

标签: python sql-server django pyodbc django-pyodbc

Django版本1.8.16 pyodbc版本:3.0.11b16

我一直在努力为项目制作一个视图/提交表单。 我需要实现的基本目标是使用MS SQL Server 2014中的存储过程查看和编辑/保存表单中的数据。我能够在视图页面中使用存储过程但是无法通过编辑来执行此操作item并添加一个新项目。

models.py

branchB

views.py

class procedures():
def view_patientsp(self, patid):
    cursor = connection.cursor()
    ret = cursor.execute("EXEC PR_PRES_viewpatient @uid=?  ", (patid))
    cursor.close()
    return ret


class Patient(models.Model):
    patientid = models.AutoField(db_column='PatientID', primary_key=True)  
    pyear = models.DecimalField(db_column='Pyear', max_digits=10, decimal_places=0, blank=True, null=True)  
    dref = models.DecimalField(db_column='DRef', max_digits=10, decimal_places=0, blank=True, null=True)  
    title = models.TextField(db_column='Title', blank=True, null=True)  
    fname = models.TextField(db_column='FName', blank=True, null=True)  
    lname = models.TextField(db_column='LName', blank=True, null=True)  
    dob = models.DateTimeField(db_column='DOB', blank=True, null=True)  
    pamonth = models.TextField(db_column='PAMonth', blank=True, null=True)  
    payear = models.TextField(db_column='PAYear', blank=True, null=True)  
    padays = models.TextField(db_column='PADays', blank=True, null=True)  
    sex = models.TextField(db_column='Sex', blank=True, null=True)

urls.py

def view_patient(request):
    if request.method == 'POST':
        form = viewpatientform(request.POST)
        return render(request, 'lis/view.html', {'form': form})
    else:
        form = viewpatientform()
        if form.is_valid():
            procedure = procedures()
            ret = procedure.view_patientsp(request.POST['fields'])
        return render_to_response('lis/view.html', {'form': form})

view.html

urlpatterns = [
url(r'^$', views.pat_list, name='index'),
url(r'^view/(?P<patid>\d+/)$', views.view_patient, name='viewpatient'), ]

1 个答案:

答案 0 :(得分:1)

您有几个选择。我将尝试在这里概述它们,因为我有一个类似的项目,我们用另一种语言编写了一个非常大的站点,并且由SQL Server支持存储过程,我们正在缓慢但肯定地迁移到Django

我们的目标是随着时间的推移进行全面改写。这意味着用Django的模型和视图替换存储过程中的逻辑,因为ORM非常强大。我们发现它减少了重复并大幅提高了可重用性,从而减少了代码总量。

您可以使用Django&#39; inspectdb等功能生成一组初始的Django模型来与您的数据库进行交互。它需要一些修改,但这使我们能够使用一些功能(如Django&#s; admin)对旧数据库进行crud操作,而不是编写三层来进行简单的查找表更新。我不建议自定义管理员,但是使用它可以很好地开始熟悉Django的工作方式。

您可以使用许多Django的功能(如模板和表单)来调用存储过程。例如,在FormView中,您可以执行以下操作:

class MyFormView(FormView):
    template_name = 'home.html'
    form_class = MyForm
    success_url = '/hooray/'

    def form_valid(self, form):
        sender = form.cleaned_data['sender']
        message = form.cleaned_data['message']

        cursor = connections['default'].cursor()
        cursor.execute('EXEC usp_insert_message @sender = ?, message = ?', sender, message)

        return super(MyFormView, self).form_valid(form)

但请注意编写FrankenDjango的编码。我们在过渡期间一直在努力确保两个网站可以并行运行,并在两者之间共享身份验证。这允许我们随着时间的推移将功能移动到新的Django站点,同时以正确的方式在新代码库中执行操作。在您正确使用模型,视图和模板的流程之后,您可能会惊喜地发现,您可以快速开始移动事物,尤其是Django丰富的即用型生态系统生态系统

最后一点说明:我强烈建议您为Django数据库引擎使用django-pyodbc-azure(适用于SQL Server Azure)。我随着时间的推移发现它是最积极维护的,并且刚刚起作用。您可以像这样安装Django 1.8:

pip install django-pyodbc-azure<1.9

可在此处找到更多详细信息:https://github.com/michiya/django-pyodbc-azure

祝你好运!