Добавление контактной формы к существующему представлению страницы контактов с помощью представлений на основе классов в Django

Я пытаюсь добавить форму "свяжитесь с нами" на существующую страницу "свяжитесь с нами", используя модель формы и представления на основе классов. Сначала я создал модель ниже:

class ContactUsForm(models.Model):
    first_name = models.CharField(max_length=200, blank=False, null=False)
    last_name = models.CharField(max_length=200, blank=False, null=False)
    email = models.EmailField(blank=False, null=False)
    subject = models.CharField(max_length=250, blank=False, null=False)
    message_body = models.TextField()

    def __str__(self):
        return self.subject

Затем я создал свою форму в файле forms.py следующим образом:

class ContactForm(ModelForm):
    class Meta:
        model = ContactUsForm
        fields = "__all__"

Мой предыдущий вид страницы контактов выглядит следующим образом:

class ContactUsPageView(ListView):
    """
    In this view we are fetching site data from database, in a function named
    get_context_data. In this function, we filter the model for objects that contains
    the word 'تماس', therefore fetching data referring to the about page only.
    After that the context list is sent to the template, and there with a for loop
    and an if statement, each key, value set is chosen for the proper place.
    """

    model = SiteDataKeyValue
    template_name: str = "core/contact-us.html"

    def get_context_data(self, **kwargs):
        context = super(ContactUsPageView, self).get_context_data(**kwargs)
        context["contact_page_data"] = self.model.objects.filter(key__icontains="تماس")
        return context

Теперь я понятия не имею, как действовать дальше. Как мне добавить эту форму в представление, затем отправить ее вместе с contact_page_data в шаблон, и как ее стилизовать (стилизация здесь не при чем, и я займусь этим, как только представление будет готово).

Вы должны использовать простой FormView:

class ContactUsPageView(FormView):

    form_class = ContactForm
    template_name: str = "core/contact-us.html"
    success_url = "..."

    def form_valid(self, form):
        form.save()
        return super().form_valid(form)

    def get_context_data(self, **kwargs):
        context = super(ContactUsPageView, self).get_context_data(**kwargs)
        context["contact_page_data"] = self.model.objects.filter(key__icontains="تماس")
        return context

и отобразите с помощью {{form}} вашу форму в html

Посмотрите, поможет ли это

class ContactUsPageView(ListView):

    model = SiteDataKeyValue
    template_name: str = "core/contact-us.html"
    context_object_name = 'contact_page_data'

    def get_queryset(self):
        return SiteDataKeyValue.objects.filter(key__icontains="تماس")

    def get_context_data(self, **kwargs):
        form = ContactForm()
        context = super(self).get_context_data(**kwargs)
        if not kwargs.get("form"):
            context['form'] = form
        return context

    def post(self, request, pk, **kwargs):
        data = request.POST
        form = ContactForm(request.POST)
        # form = ContactForm(request.POST, request.FILES) # If your sending files in the form
        if form.is_valid():
            form.save()
            return direct to success_url

        # render form with errors
        context = self.get_context_data(form=form)
        return self.render_to_response(context)
Вернуться на верх