Добавление контактной формы к существующему представлению страницы контактов с помощью представлений на основе классов в 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)