Mam formę:

<form id="contact-form" class="contact__form" method="POST" action="{% url 'backcall' %}">

    {% csrf_token %}
    <span class="text-color">Send letter</span>
    <div class="form-group">
        <input name="name" type="text" class="form-control" placeholder="Name">
    </div>
     <div class="form-group">
       <input type="tel" name="phone" class="form-control" placeholder="Phone (+380)"  pattern="[\+][3][8][0]\d{9}" minlength="13" maxlength="13" />
    </div>
    <div class="form-group">
        <input name="email" type="email" class="form-control" placeholder="Email">
    </div>
    <div class="form-group-2 mb-4">
        <textarea name="message" class="form-control" rows="4" placeholder="Your letter"></textarea>
    </div>
    <button class="btn btn-main" name="submit" type="submit">Send</button>
</form>

Views.py:

def backcall(request):
    backcall = BackCall(name = request.POST['name'], phone = request.POST['phone'], email=request.POST['email'] , message = request.POST['message'])
    backcall.save()
    return redirect('thanks')

Models.py

class BackCall(models.Model):
    name = models.CharField(max_length=50)
    phone = models.CharField(max_length=13)
    email = models.EmailField()
    message = models.TextField(default=None)
    datetime = models.DateTimeField(auto_now_add=True)

Kiedy wypełniam formularz i przesyłam, nic się nie dzieje. Kiedy klikam link „backcall/”, pojawia się błąd.

Z czym problem może być związany i jak go naprawić?

0
Aleksandr Lozko 20 grudzień 2019, 00:50

1 odpowiedź

Proszę, szukaj więcej, znajdź rozwiązanie

Użyj metody get MultiValueDict. To jest również obecne na standardowe dicts i jest sposobem na pobranie wartości przy jednoczesnym zapewnieniu domyślnej jeśli nie istnieje.

def backcall(request):
    backcall = BackCall(name = request.POST.get('name'), phone = request.POST.get('phone'), email=request.POST.get('email') , message = request.POST.get('message'))
    backcall.save()
    return redirect('thanks')

Powinieneś sprawdzić, czy rekord istnieje w Twojej bazie danych, myślę, że szybkim przykładem będzie:

 def backcall(request):
     obj, created = BackCall.objects.get_or_create(email=request.POST.get('email'),
                           defaults={'phone': request.POST.get('phone'),
                                              'name': request.POST.get('name'),
                                              'message': request.POST.get('message')}

    if created:
       return redirect('thanks')

    return ...
0
Diego Peñalver Montero 20 grudzień 2019, 11:50
Zaktualizowałem odpowiedź, to jest kilka najlepszych praktyk
 – 
Diego Peñalver Montero
20 grudzień 2019, 01:50
Znowu ten sam błąd: obiekt 'method' nie jest indeksowany
 – 
Aleksandr Lozko
20 grudzień 2019, 10:25
Kiedy zmieniłem ''[]" na "()", teraz wygląda to tak na przykład: "request.POST.get('phone')" dostałem ten błąd: DETAIL: Ciąg błędu zawiera (7, null, null, 2019-12-20 07:26: 23.948613 + 00, null, null).
 – 
Aleksandr Lozko
20 grudzień 2019, 10:29
Przepraszam, to był błąd. Ja zaktualizowałem. Szczegółowy błąd, który komentujesz, dotyczy typów danych modelu, gdzie są dane e-mail? Masz pole e-mail
 – 
Diego Peñalver Montero
20 grudzień 2019, 11:54
Dlaczego nie chce pobierać danych z pól i ich zapisywać?
 – 
Aleksandr Lozko
20 grudzień 2019, 17:10