Как сохранить информацию формы, чтобы она отображалась на панели администратора сайта? - PullRequest
0 голосов
/ 10 марта 2019

Я создаю веб-страницу, и есть раздел контактов, в котором я ищу людей, которые оставят сообщение, и затем я связываюсь с ними, я хочу, чтобы информация, введенная в форму, была сохранена в базе данных, чтобы позже я это можно увидеть на странице администратора Django.

# models.py
from django.db import models

class Contact(models.Model):
    name = models.CharField(max_length = 100, verbose_name = "Nombre")
    email = models.CharField(max_length = 100, verbose_name = "Email")
    issue = models.CharField(max_length = 200, verbose_name = "Asunto")
    text = models.TextField(verbose_name = "Mensaje")


# forms.py
from django import forms

class ContactForm(forms.Form):
    name = forms.CharField(max_length = 100, label = "Nombre")
    email = forms.EmailField(label = "Correo electrónico")
    issue = forms.CharField(max_length = 200, label = "Asunto")
    text = forms.CharField(label = "Mensaje")


# views.py
from django.views.generic import TemplateView
from contact.forms import ContactForm
from django.shortcuts import render

class Contact(TemplateView):
    template_name = 'contact/contact.html'

    def get(self, request):
        form = ContactForm
        return render(request, self.template_name, {'form': form})

    def post(self, request):
        form = ContactForm(request.POST)

        if form.is_valid():
            name = form.cleaned_data['name']
            email = form.cleaned_data['email']
            issue = form.cleaned_data['issue']
            text = form.cleaned_data['text']
            form = ContactForm()
            args = {
                'form': form, 
                'name': name,
                'email': email,
                'issue': issue,
                'text': text,
                }

            return render(request, self.template_name, args)


<!-- And this is the form -->
<div class="page-section contact-page">
    <div class="contact-warp">
        <div class="row">
            <div class="col-xl-6 p-0">
                <div class="contact-text">
                    <span>¡Hola!</span>
                    <h2>Contáctame</h2>
                    <form class="contact-form" method="post">
                    {% csrf_token %}
                    {{ form.as_p }}
                    <button class="site-btn">Enviar mensaje</button>
                    </form>
                </div>
            </div>
        </div>
    </div>
</div>

Я сделал несколько попыток, но не могу получить информацию для отображения в админе (я уже зарегистрировал модель в админе). Пожалуйста, помогите мне: (

Ответы [ 2 ]

0 голосов
/ 10 марта 2019

Ну, так как вы не используете ModelForm , то вам нужно сохранить эти значения вручную в представлении.Например:

def post(self, request):
    form = ContactForm(request.POST)

    if form.is_valid():
        name = form.cleaned_data['name']
        email = form.cleaned_data['email']
        issue = form.cleaned_data['issue']
        text = form.cleaned_data['text']
        args = {
            'form': form, 
            'name': name,
            'email': email,
            'issue': issue,
            'text': text,
        }
        Contact.objects.create(**args)  # <-- saving to DB
        # rest of the code

Я не уверен, почему вы используете TemplateView, потому что FormView гораздо больше подходит для обработки формы.Например:

class ContactView(FormView):
    form_class = ContactForm
    template_name = 'contact/contact.html'
    success_url= '/'

    def form_valid(self, form):
        name = form.cleaned_data['name']
        email = form.cleaned_data['email']
        issue = form.cleaned_data['issue']
        text = form.cleaned_data['text']
        args = {
            'form': form, 
            'name': name,
            'email': email,
            'issue': issue,
            'text': text,
        }
        Contact.objects.create(**args)
        return super(ContactView).form_valid(form)

Кроме того, если вы используете ModelForm , то вы можете просто хранить данные следующим образом:

class ContactForm(forms.ModelForm):
    class Meta:
        model = Contact
        fields = "__all__"

# usage

if form.is_valid():
    form.save()
    # rest of the code
0 голосов
/ 10 марта 2019

Вам нужно позвонить form.save(), чтобы ваши данные были сохранены. Это не сохраняется в настоящее время. Назовите это внутри form.is_valid(): блока.

Кроме того, вам не нужно передавать значения формы. Вы можете получить к ним доступ, используя form.data.field_name.

...