Django ModelForm выполняет итерацию по значениям MultipleChoiceField и обрабатывает POST - PullRequest
0 голосов
/ 19 апреля 2020

Уровень : Абсолютный Новичок, пытающийся создать приложение для выполнения некоторой операции с БД через веб-интерфейс

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 после отправки пользовательской формы и l oop через введенные значения для выполнения какого-либо действия. Я пытался это долго, до сих пор не могу понять, как. Я не хочу ничего обрабатывать во внешнем интерфейсе html. Я думаю, что это должно быть обработано в представлениях, но не уверен, как получить значения поля и l oop over.

Любые примеры или любые django концепции, которые нужно изучить, помогут мне много. Любая помощь приветствуется, спасибо заранее!

1 Ответ

0 голосов
/ 19 апреля 2020

Если вы еще этого не сделали, я рекомендую просмотреть Django документы по представлениям на основе классов (https://docs.djangoproject.com/en/3.0/topics/class-based-views/intro/), чтобы получить общее представление о том, как все это работает.

Таким образом, после отправки формы вызывается post() метод вашего представления. CreateView обеспечивает реализацию по умолчанию, которая проверяет вводимые пользователем данные с использованием предоставленного вами MysqlUserForm, а затем создает экземпляр MysqlUser и перенаправляет на success_url.

Если вы хотите добавить больше logi c, вам нужно переписать метод post() (или какой-либо другой метод, вызываемый post(), в частности, метод form_valid) и поместить туда свои logi c. Чтобы получить полное представление о том, как все работает, я рекомендую вам прочитать исходный код 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)

PS Хорошая IDE, такая как PyCharm, действительно намного удобнее для чтения исходного кода, перехода к соответствующим частям и отладки , чем для любого текстового редактора и отладчика PDB.

...