Django ModelForm遍历MultipleChoiceField值并在POST上进行处理

时间:2020-04-19 20:18:44

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

级别:绝对入门,尝试构建一个应用来通过Web UI执行一些数据库操作

models.py

from django.db import models

class MysqlUser(models.Model):
    username = models.CharField(max_length=100)
    password = models.CharField(max_length=50)
    environment = models.CharField(max_length=50)


forms.py

from django import forms
from onboard_app.models import MysqlUser


class MysqlUserForm(forms.ModelForm):
    CHOICES = (
                ('test', 'Test'),
                ('develop', 'Develop'),
                ('staging', 'Staging'),
               )

    environment = forms.MultipleChoiceField(choices=CHOICES)
    password = forms.CharField(widget=forms.PasswordInput)

    class Meta:
        model = MysqlUser
        fields = ('username', 'password', 'environment')


views.py

from django.shortcuts import render
from onboard_app.serializers import MysqlUserSerializer
from rest_framework import generics

from onboard_app.forms import MysqlUserForm
from onboard_app.models import MysqlUser
from django.views.generic.edit import CreateView, UpdateView, DeleteView


class MysqlCreateView(CreateView):
    model = MysqlUser
    form_class = MysqlUserForm
    template_name = 'mysqluser_form.html'
    success_url = '/mysql/user/add/'


mysqluser_form.html

{% extends "myapp/base.html" %}

{% block title %}MyApp{% endblock %}



{%  block content %}

    <h1>MySQL User Access</h1>
    <form method="post">
    {% csrf_token %}
    {{ form.as_p }}
    <input type="submit" class="btn btn-primary" value="Grant Access">
    </form>

{% endblock %}


我正在尝试在用户提交表单后获取字段或MultipleChoiceFiled environment的值,并循环输入的值以执行某些操作。我已经尝试了很久了,仍然不知道怎么做。我不想在前端html中处理任何内容。我认为它必须在“视图”中进行处理,但不确定如何获取字段的值并进行循环。

要研究的任何示例或任何django概念都会对我有很大帮助。感谢您的任何帮助,谢谢!!

1 个答案:

答案 0 :(得分:0)

除非您已经这样做,否则建议您在基于类的视图(https://docs.djangoproject.com/en/3.0/topics/class-based-views/intro/)上浏览Django文档,以大致了解整个过程。

因此,提交表单后,将调用视图的post()方法。 CreateView提供了一个默认实现,该实现使用您提供的MysqlUserForm验证用户输入,然后创建MysqlUser的实例并重定向到success_url

如果您想添加更多逻辑,则需要覆盖post()方法(或其他由post()调用的方法,特别是form_valid方法)并将您的逻辑在那里。为了全面了解工作原理,尽管继承看起来有些复杂(确实如此),但我建议您通读CreateView,BaseCreateView,ProcessFormView和ModelFormMixin源代码。更重要的是,我真的建议您使用调试器逐步完成从View.dispatch方法到form_valid方法的请求处理过程,并查看其工作原理。相信我,它将为您的发展技能的提高和理解提供真正的帮助。实际上,我已经发现了form_valid方法,可以通过阅读源代码来编写此答案(如今,我使用rest-framework,并且对Django视图的了解不多)。

所以,您需要的是

class MysqlCreateView(CreateView):
    model = MysqlUser
    form_class = MysqlUserForm
    template_name = 'mysqluser_form.html'
    success_url = '/mysql/user/add/' 

    def form_valid(self, form):
        environment = form.cleaned_data['environment']
        # insert your code here
        return super().form_valid(form)

P.S。像PyCharm这样的优秀IDE,实际上比任何文本编辑器和PDB调试器都更方便阅读源代码,跳转到相关部分并进行 debug