首页 > 解决方案 > 我想从类方法重定向到 url

问题描述

我有 Source_page 和 Target_Page 应用程序。在 Source_page 应用程序视图中,我使用表单来选择数据库、模式和表下拉列表,并且每一个都出现在一个选定之后。

有一个类 TableStructure 需要在选择表后调用以执行某些过程。完成这些过程后,我想重定向 URL“/targetSource/”。

有人可以帮忙吗?这是代码文件

视图.py

class DBForm(forms.Form):
    database = forms.ChoiceField()

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)

        self.fields['database'].choices = self._get_databases()

    def _get_databases(self):
        self.pgObj = Postgres(server="localhost",user="postgres",password="*****",port=5433)
        dbList = self.pgObj.connect()
        dbChoiceList = getChoiceList(dbList)
        return dbChoiceList


class SchemaForm(DBForm):
    schema = forms.ChoiceField()

    def __init__(self, database, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.fields['database'].initial = database
        # self.fields['database'].widget.attrs['disabled'] = True
        self.fields['schema'].choices = self._get_schemas(database)

    def _get_schemas(self, database):
        # TODO Do NOT forget to escape "database" here to prevent injections
        schemaList= self.pgObj.schemaList(database)
        schema = getChoiceList(schemaList)
        return schema


class TableForm(SchemaForm):
    table = forms.ChoiceField()

    def __init__(self, database, schema, *args, **kwargs):
        super().__init__(database, *args, **kwargs)
        self.fields['schema'].initial = schema
        # self.fields['schema'].widget.attrs['disabled'] = True
        self.fields['table'].choices = self._get_tables(database, schema)

    def _get_tables(self, database, schema):
        # TODO Do NOT forget to escape "database" here to prevent injections
        tableList = self.pgObj.tableList(schema)
        table = getChoiceList(tableList)
        return table


class TableStructure(TableForm):

    def __init__(self, database, schema, table, *args, **kwargs):
        super().__init__(database, schema, *args, **kwargs)
        self.fields['table'].initial = table
        self.fields['schema'].widget.attrs['disabled'] = True
        self.fields['database'].widget.attrs['disabled'] = True
        self._get_tables_structure(database, schema, table)

        # self.fields['acknowledge'].widget.attrs['disabled'] = True

    def _get_tables_structure(self,database, schema, table):
        # print("INSIDE GET TABLE STRUCTURE")
        # return HttpResponseRedirect('127.0.0.1:8000/targetSource/')
        # return redirect('http://127.0.0.1:8000/targetSource/')
        # return redirect('targetCreds') 
        data = self.pgObj.getTableData(schema, table)
        print("writing File ",table)
        data.to_csv(table+".csv", index=False,sep='|')
        print("file Wrote now mapping columns")

        COL_MAPPING_FILE = "postgresToRedshiftColMapping.csv"
        mapped_list = self.pgObj.get_ColMapped(table, COL_MAPPING_FILE)
        print("Got mapped list Outside : ",mapped_list)
        pkCol  = self.pgObj.get_Primary_Key(table)
        print("Primary Key:",pkCol)
        createTabelquery = self.pgObj.createTableQuery(mapped_list,table,pkCol)
        print(createTabelquery)
        selectedTable = dict()
        selectedTable['table']=[table]
        selectedTable['createTableQuery']=createTabelquery
        selectedTable = json.dumps(selectedTable)
        file = open("SelectedTable.json", 'w', encoding='utf-8')
        file.write(selectedTable)






class TestView(generic.FormView):
    template_name = 'source_database/test.html'
    # template_name = 'source_database/selectTables.html'
    def get_form(self, form_class=None):
        kwargs = self.get_form_kwargs()
        database = self.kwargs.get('database')
        schema = self.kwargs.get('schema')
        table = self.kwargs.get('table')
        if table:
            print("Inside get_form table")
            return TableStructure(table=table,schema=schema,database=database, **kwargs)
        if schema:
            print("Inside get_form schema")
            return TableForm(schema=schema,database=database, **kwargs)
        if database:
            print("Inside get_form database")
            return SchemaForm(database=database, **kwargs)
        return DBForm(**kwargs)

    def form_valid(self, form):
        database = form.cleaned_data.get('database')
        schema = form.cleaned_data.get('schema')
        table = form.cleaned_data.get('table')

            # return redirect('targetCreds')
        if table:
            return HttpResponseRedirect(reverse('data', kwargs={'schema': schema, 'database': database, 'table': table}))
        if schema:
            print("Inside form_valid schema")  
            return HttpResponseRedirect(reverse('test', kwargs={'schema': schema, 'database': database}))
        if database:
            print("Inside form_valid database") 
            return HttpResponseRedirect(reverse('test', kwargs={'database': database}))
        return HttpResponseRedirect(reverse('test'))

网址.py

urlpatterns = [
    path('admin/', admin.site.urls),
    path('register/', user_views.register, name='register'),
    path('profile/', user_views.profile, name='profile'),
    path('login/', auth_views.LoginView.as_view(template_name='users/login.html'), name='login'),
    path('logout/', auth_views.LogoutView.as_view(template_name='users/logout.html'), name='logout'),
    path('form/', sourceform_view.resource, name='resources'),
    # path('tables/', sourceform_view.select_tables, name="tables"),
    path('blogs/', include('blog.urls')),
    path('',auth_views.LoginView.as_view(template_name='users/login.html'), name='login'),
    path('tables/', sourceform_view.TestView.as_view(), name='test'),
    path('tables/<str:database>/', sourceform_view.TestView.as_view(), name='test'),
    path('tables/<str:database>/<str:schema>/', sourceform_view.TestView.as_view(), name='test'),
    path('tables/<str:database>/<str:schema>/<str:table>', sourceform_view.TestView.as_view(), name='data'),
    path('targetSource/', targetform_view.target, name='targetCreds'),
    path('targetSource/process/', targetform_view.process, name='targetProcess'),
] 

模板 test.html

{% extends "blog/layout.html" %} 
{% load crispy_forms_tags %}
{% block content %}
    <form name ='xyz' method="post"  onchange="xyz.submit();">
        {% csrf_token %}
        {{ form.as_p }}
        <!-- <input type="submit" value="Submit"/> -->
    </form> 
{% endblock content %}
''

标签: django

解决方案


首先,你对Django's FormView类的理解是错误的。通常重定向应该从form_valid()form_invalid()方法发生。get_form()负责创建你的Form类的实例,仅此而已。最好的方法是在方法内创建TableStructure(table=table,schema=schema,database=database, **kwargs)对象form_valid()然后 make HttpResponseRedirect。但在你的情况下,你可以做这样的事情,,,

class TestView(generic.FormView):
    template_name = 'source_database/test.html'
    form_class = YourFormClassHere # + Add your form class here
    # template_name = 'source_database/selectTables.html'
    def get_form(self, form_class=None):
        my_form = super(TestView, self).get_form() # +
        kwargs = self.get_form_kwargs()
        database = self.kwargs.get('database')
        schema = self.kwargs.get('schema')
        table = self.kwargs.get('table')
        if table:
            print("Inside get_form table")
            table_structure = TableStructure(table=table,schema=schema,database=database, **kwargs)
            self.form_valid(my_form) # +
        if schema:
            print("Inside get_form schema")
            return TableForm(schema=schema,database=database, **kwargs)
        if database:
            print("Inside get_form database")
            return SchemaForm(database=database, **kwargs)
        return DBForm(**kwargs)

    def form_valid(self, form):
        database = form.cleaned_data.get('database')
        schema = form.cleaned_data.get('schema')
        table = form.cleaned_data.get('table')

            # return redirect('targetCreds')
        if table:
            return HttpResponseRedirect(reverse('data', kwargs={'schema': schema, 'database': database, 'table': table}))
        if schema:
            print("Inside form_valid schema")  
            return HttpResponseRedirect(reverse('test', kwargs={'schema': schema, 'database': database}))
        if database:
            print("Inside form_valid database") 
            return HttpResponseRedirect(reverse('test', kwargs={'database': database}))
        return HttpResponseRedirect(reverse('test'))

测试这段代码。


推荐阅读