【问题标题】:Django, Modelform not renderingDjango,Modelform不呈现
【发布时间】:2019-11-22 02:28:03
【问题描述】:

我在 django 中创建了一个基本的 Modelform,但我的表单没有呈现。

tasks.html

<table class="...">
        <tr>
            <th>Function</th>
        </tr>
        <tr>
            <td>
                <form method="POST">
                    {% csrf_token %}
                    {{ form }}
                    <button type="submit">Execute</button>
                </form>
            </td>
        </tr>
</table>

models.py

class Tasks(models.Model):

    #Task module 

    function_name = models.CharField(max_length=30, default='')
    script_location = models.CharField(max_length=300, default='')

forms.py

from django.forms import ModelForm

from .models import Tasks

class Tasks(ModelForm):

    class Meta:
        model = Tasks
        fields = ['function_name','script_location']

views.py

class Tasks(View):

    def get(self, request):
        form = Tasks()
        return render(request, '.../tasks.html', {'form': form})

除了看到两个文本字段外,我只看到“执行”按钮

【问题讨论】:

    标签: python django render modelform


    【解决方案1】:

    简答:避免名称冲突。为您的表单和视图添加后缀。

    您将模型命名为Tasks,将表单命名为Tasks,将视图命名为Tasks。在这里,您视图中的 Tasks() 调用将解析为该视图,因此确实如此:

    class Tasks(View):
    
        def get(self, request):
            form = Tasks()
            return render(request, '.../tasks.html', {'form': form})

    在这里,您只需创建一个新的Tasks 对象(View 的子类)。

    强烈建议重命名您的课程:

    1. 一个model通常有noModel后缀,所以你可以保留这个Task(单数);
    2. 一个表单可以使用Form后缀,所以TaskForm;和
    3. 您的视图可以重命名为TaskView

    重命名后,您可以将视图重写为:

    class TaskView(View):
    
        def get(self, request):
            form = TaskForm()
            return render(request, '.../tasks.html', {'form': form})

    但是,在这里,您基本上实现了CreateView [Django-doc],例如:

    from django.urls import reverse_lazy
    from django.views.generic.edit import CreateView
    
    class TaskView(CreateView):
        model = Task
        fields = ('function_name','script_location')
        template_name = '.../tasks.html'
        success_url = reverse_lazy('certain-view')

    对于 GET 请求,这将在上下文中呈现带有 form 的模板。它还将执行一个 POST 请求,该请求将创建一个模型对象并将其保存到数据库中,然后重定向到 certain-view。所以它会为你实现很多样板代码。

    【讨论】:

    • CreateView 为我做了这件事。非常感谢!
    【解决方案2】:

    改变你的forms.py

    from django.forms import ModelForm
    from .models import Tasks
    class TasksForms(ModelForm):
        class Meta:
            model = Tasks
            fields = ('function_name','script_location',)
    

    在你的应用 urls.py 中添加 url

    path('your_url/', views.TaskView, name='task'),
    

    改变你的观点.py

    def TaskView(request) :
    
        def get(self, request):
            form = TasksForms()
            return render(request, '.../tasks.html', {'form': form})
    

    不要忘记在 tasks.html 中添加表单的操作

    【讨论】:

    • 但是现在您将TaskView 转换为基于函数的视图,并使用内部方法get。不仅会调用get 方法(除非你明确地调用它),它还会导致一个无用的内部方法(例如它不能被腌制)。
    猜你喜欢
    • 2018-05-31
    • 2017-08-04
    • 1970-01-01
    • 2016-04-01
    • 2022-01-03
    • 1970-01-01
    • 1970-01-01
    • 2017-08-21
    • 1970-01-01
    相关资源
    最近更新 更多