Django Models - форма сохраняется, но модель пуста

Не уверен, что мой заголовок полностью отражает мою проблему.

Решил выложить скриншот проблемы (админ панель), чтобы всем было понятнееDjango - Empty models

Похоже, что форма сохраняется, но внутрь ничего не попадает.

Вот код модели:

class Venue(models.Model):
    name = models.CharField(verbose_name="Name",max_length=100, null=True, blank=True)
    address = models.CharField(verbose_name="Address",max_length=100, null=True, blank=True)
    town = models.CharField(verbose_name="Town",max_length=100, null=True, blank=True)
    county = models.CharField(verbose_name="County",max_length=100, null=True, blank=True)
    post_code = models.CharField(verbose_name="Post Code",max_length=8, null=True, blank=True)
    country = models.CharField(verbose_name="Country",max_length=100, null=True, blank=True)
    longitude = models.CharField(verbose_name="Longitude",max_length=50, null=True, blank=True)
    latitude = models.CharField(verbose_name="Latitude",max_length=50, null=True, blank=True)
    city = models.CharField(max_length=120)
    
    def __str__(self):
        return str(self.name) if self.name else ''

Очевидно, я понимаю, что просил вернуть '', если self.name не было там. Причина, по которой я это сделал, заключается в том, что изначально модели были видны на панели администратора под "-", но при нажатии на них выдавалось сообщение об ошибке.

Учитывая, что я работаю с формой, вот код формы:

class VenueForm(forms.ModelForm):
    name = forms.CharField(max_length=100, required=True, widget = forms.HiddenInput())
    address = forms.CharField(max_length=100, required=True, widget = forms.HiddenInput())
    town = forms.CharField(max_length=100, required=True, widget = forms.HiddenInput())
    county = forms.CharField(max_length=100, required=True, widget = forms.HiddenInput())
    post_code = forms.CharField(max_length=8, required=True, widget = forms.HiddenInput())
    country = forms.CharField(max_length=40, required=True, widget = forms.HiddenInput())
    longitude = forms.CharField(max_length=50, required=True, widget = forms.HiddenInput())
    latitude = forms.CharField(max_length=50, required=True, widget = forms.HiddenInput())
    phone = forms.CharField(max_length=120)
    web = forms.URLField(max_length=120)
    email_address = forms.CharField(max_length=120)

    class Meta:
        model = Venue
        fields = ['name', 'address', 'town', 'county', 'post_code','country','post_code','latitude','city', 'web', 'phone', 'email_address']

взгляды

def add_venue(request):
    submitted = False
    form = VenueForm()
    venue = Venue.objects.create()
    if is_ajax(request) and request.method =="POST":
        form = VenueForm(data = request.POST, instance = venue)
        data = form.save(commit = False)
        data.name = form.cleaned_data['name']
        data.address = form.cleaned_data['address']
        data.town = form.cleaned_data['town']
        data.county = form.cleaned_data['county']
        data.post_code = form.cleaned_data['post_code']
        data.country = form.cleaned_data['country']
        data.longitude = form.cleaned_data['longitude']
        data.latitude = form.cleaned_data['latitude']
        data.city = form.cleaned_data['city']
        data.phone = form.cleaned_data['phone']
        data.web = form.cleaned_data['web']
        data.email_address = form.cleaned_data['email_address']
        data.save()
        if form.is_valid():
            form.save()
            messages.success(request,("Success!"))
            return HttpResponseRedirect('/add_venue?submitted=True')
        else:
            form = VenueForm
            if 'submitted' in request.GET:
                submitted = True
    context = {
    'form' : form,
    'submitted' : submitted,
    'google_api_key' : settings.GOOGLE_API_KEY,
    'base_country' : settings.BASE_COUNTRY,
    }
    return render(request,"main/add_venue.html",context)

и, наконец, html-файл

<div class="form-group">


<input type="text" placeholder="*Begin typing address" id="id-google-address" name="google_address">

  <form id="venueform" method="POST" action="{% url 'add_venue'%}">
    {% csrf_token %}

   <label for="name" class="hidden-el" hidden>Name</label>
   {{form.name}}

   <label for="address" class="hidden-el" hidden>Address</label>
   {{form.address}}

   <label for="town" class="hidden-el" hidden>Town/City</label>
   {{form.town}}

   <label for="county" class="hidden-el" hidden>County</label>
   {{form.county}}

   <label for="post_code" class="hidden-el" hidden>Postal Code</label>
   {{form.post_code}}

   <label for="country" class="hidden-el" hidden>Country</label>
   {{form.country}}

   <label for="longitude" class="hidden-el" hidden>Longitude</label>
   {{form.longitude}}

   <label for="latitude"  class="hidden-el" hidden>Latitude</label>
   {{form.latitude}}
   <h4>Phone</h4>
   <label for="phone"  class="hidden-el" hidden>Phone</label>
   {{form.phone}}
   <h4>WebSite</h4>
   <label for="web"  class="hidden-el" hidden>Website</label>
   {{form.web}}
   <h4>Email Address</h4>
   <label for="email_address"  class="hidden-el" hidden>Email Address</label>
   {{form.email_address}}

        <button type = "submit" class="btn btn-secondary">Add Venue</button>
</form>
</div>

{% endblock %}

{% block extend_footer %}

<script type="text/javascript">

  var google_api_key = "{{google_api_key|safe}}";
  var base_country = "{{base_country|safe}}";

</script>

<script src="{% static 'google_places.js' %}"></script>


{% endblock %}
def add_venue(request):
    submitted = False
    form = VenueForm()
    venue = Venue.objects.create() # <- This line is the issue.

Вы создаете пустое место и ничего не делаете с переменной.

Тогда вы сохраняете форму

        data = form.save(commit = False)
        data.name = form.cleaned_data['name']
        data.address = form.cleaned_data['address']
        data.town = form.cleaned_data['town']
        data.county = form.cleaned_data['county']
        data.post_code = form.cleaned_data['post_code']
        data.country = form.cleaned_data['country']
        data.longitude = form.cleaned_data['longitude']
        data.latitude = form.cleaned_data['latitude']
        data.city = form.cleaned_data['city']
        data.phone = form.cleaned_data['phone']
        data.web = form.cleaned_data['web']
        data.email_address = form.cleaned_data['email_address']
        data.save()

Без предварительной валидации формы. Перед этим необходимо вызвать form.is_valid().

Затем вы проверяете форму и снова сохраняете ее. Вы пробуете один объект 3 раза. 2 из которых выполняются неправильно.

Значит, вы не инстанцируете свою форму в

         else:
            form = VenueForm
            if 'submitted' in request.GET:
                submitted = True

Кроме того, вы должны вернуть форму POSTed, чтобы вы могли отправить обратно form.errors().

        else:
            form = VenueForm()
            if 'submitted' in request.GET:
                submitted = True

Если это ModelForm, все, что необходимо, это:

def add_venue(request):
    submitted = False
    form = VenueForm()
    if is_ajax(request) and request.method =="POST":
        form = VenueForm(data = request.POST)
        if form.is_valid():
            form.save()
            messages.success(request,("Success!"))
            return HttpResponseRedirect('/add_venue?submitted=True')
    context = {
    'form' : form,
    'submitted' : submitted,
    'google_api_key' : settings.GOOGLE_API_KEY,
    'base_country' : settings.BASE_COUNTRY,
    }
    return render(request,"main/add_venue.html",context)
Вернуться на верх