Django: сохранение записей html в БД mysql

#python #mysql #django

#python #mysql #django

Вопрос:

Я пытаюсь следить за этим проектом с открытым исходным кодом, чтобы узнать больше о Django и crispy. Для этого я пытаюсь расширить этот проект с открытым исходным кодом

Я скачал проект с GitHub и запустил его :). Однако models.py отсутствует, и я подумал, что попробую добавить его и поместить данные HTML-формы в мою локальную базу данных mysql. Итак, в основном я пытаюсь расширить этот существующий код. Я смог добавить models.py и создайте таблицу в mysql.

Проблема: если я нажимаю кнопку отправки, данные в mysql не отображаются. Я думаю, я понял, что мне нужна какая-то команда «save ()». Но где? Я также получаю эту ошибку: «POST / form / 4 / HTTP / 1.1″ 302 0»

Я нашел публикации в Google о кодлинах в forms.py и view.py . Но либо это не разрешило проблему, либо вызвало ошибку. Есть идеи, как это преодолеть?

models.py

 from django.db import models
from mysite.core.choice import STATES

class Address(models.Model):
    email = models.CharField(max_length=100, blank=True)
    password = models.CharField(max_length=100, blank=True)
    address_1 = models.CharField(max_length=100, blank=True)
    address_2 = models.CharField(max_length=100, blank=True)
    city = models.CharField(max_length=100, blank=True)
    zip_code = models.CharField(max_length=100, blank=True)
    state = models.IntegerField(default=1, choices=STATES, blank=True)
    check_me_out = models.BooleanField(default=False)
 

forms.py —> Также с комментариями о том, что я изменил против оригинал

 from django import forms

from crispy_forms.helper import FormHelper
from crispy_forms.layout import Layout, Div, Submit, Row, Column, Field
from .choice import STATES
from .models import Address

class AddressForm(forms.Form):
    Model = Address ####new added by me
    email = forms.CharField(widget=forms.TextInput(attrs={'placeholder': 'Email'}))
    password = forms.CharField(widget=forms.PasswordInput())
    address_1 = forms.CharField(label='Address', widget=forms.TextInput(attrs={'placeholder': '1234 Main St'}))
    address_2 = forms.CharField(widget=forms.TextInput(attrs={'placeholder': 'Apartment, studio, or floor'}))
    city = forms.CharField()
    state = forms.ChoiceField(choices=STATES)
    zip_code = forms.CharField(label='Zip')
    check_me_out = forms.BooleanField(required=False)


class CrispyAddressForm(AddressForm):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.helper = FormHelper()
        self.helper.form_method = 'post' ##### new added by me
        self.helper.add_input(Submit('submit', 'Sign in')) ##### new added by me
        self.helper.layout = Layout(
            Row(
                Column('email', css_class='form-group col-md-6 mb-0'),
                Column('password', css_class='form-group col-md-6 mb-0'),
                css_class='form-row'
            ),
            'address_1',
            'address_2',
            Row(
                Column('city', css_class='form-group col-md-6 mb-0'),
                Column('state', css_class='form-group col-md-4 mb-0'),
                Column('zip_code', css_class='form-group col-md-2 mb-0'),
                css_class='form-row'
            ),
            'check_me_out',
            #Submit('submit', 'Sign in') ##### originally in there but commented out by me
        )


class CustomCheckbox(Field):
    template = 'custom_checkbox.html'

class CustomFieldForm(AddressForm):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.helper = FormHelper()
        self.helper.layout = Layout(
            Row(
                Column('email', css_class='form-group col-md-6 mb-0'),
                Column('password', css_class='form-group col-md-6 mb-0'),
                css_class='form-row'
            ),
            'address_1',
            'address_2',
            Row(
                Column('city', css_class='form-group col-md-6 mb-0'),
                Column('state', css_class='form-group col-md-4 mb-0'),
                Column('zip_code', css_class='form-group col-md-2 mb-0'),
                css_class='form-row'
            ),
            CustomCheckbox('check_me_out'),
            Submit('submit', 'Sign in')
        )
 

views.py

 from django.views.generic import FormView, TemplateView
from django.urls import reverse_lazy

from .forms import AddressForm, CrispyAddressForm, CustomFieldForm


class AddressFormView(FormView):
    form_class = AddressForm
    success_url = reverse_lazy('success')


class CrispyAddressFormView(FormView):
     form_class = CrispyAddressForm
     success_url = reverse_lazy('success')
     template_name = 'crispy_form.html'

class CustomFieldFormView(FormView):
    form_class = CustomFieldForm
    success_url = reverse_lazy('success')
    template_name = 'crispy_form.html'


class SuccessView(TemplateView):
    template_name = 'success.html'

 

пожалуйста, дайте мне знать, если вы хотите увидеть больше кода, подобного html или около того.

Комментарии:

1. Вместо форм. Использование формы forms.ModelForm . и вместо FormView используйте CreateView

2. Это помогло наверняка

Ответ №1:

хорошо, это работает @Абдул Азиз Баркат

но только если я добавлю

 class Meta:
        model = Address
        fields = ('email', 'password', 'address_1', 'address_2', 'city', 'state', 'zip_code', 'check_me_out')
 

Но теперь мои определения из
класса AddressForm(forms.Form)

исчезли.
Как я могу их вернуть

Комментарии:

1. Вы можете просто сохранить свои определения полей в классе. Это будет работать должным образом.

2. Сохраните блок и мета-класс. Кроме того, почему вы публикуете несколько ответов вместо того, чтобы редактировать свой ответ. Почему вы публикуете вопрос в качестве ответа? Также удалите ту модель, которую вы написали в своей первой (вне мета, что бы форма делала с этим атрибутом в любом случае?)

3. я попробовал еще раз, и команда and сработала. что касается ответов, я просто не знал. Будем рассматривать это в будущем