как отправить форму и добавить запись в базу данных sqlite 3, используя django и jqyery с ajax - PullRequest
0 голосов
/ 14 января 2019

У меня есть форма, которая запрашивает ввод данных пользователем для сохранения записей в базе данных sqlite 3.

проблема в том, что до того, как я попытался добавить поле загрузки изображения в форму, данные были сохранены правильно. но теперь система сначала запросила, чтобы я добавил пустое и нулевое значение в num filed , поле даты , issent filed .

затем отобразится ошибка ниже:

Файл "C: \ Users \ LT GM \ Desktop \ Final new \ djangoWeb \ views.py", строка 160, в post_new id = form.te2chira_id AttributeError: у объекта 'SaveTe2chira' нет атрибута 'te2chira_id'

  • добавлено поле изображения для модели
  • добавлен элемент изображения в виде
  • добавлен тег ввода в html
  • отправка данных через AJAX в представление
  • получение данных из запроса ajax и добавление в функцию просмотра

models.py

class te2chira(models.Model):
    te2chira_id = models.AutoField( primary_key=True)
    num = models.IntegerField(blank=True, null=True)
    te2chira_date = models.DateField(blank=True, null=True)
    title = models.CharField(max_length=250,default='DEFAULT VALUE', blank=True, null=True)
    description = models.CharField(max_length=500,default='DEFAULT VALUE', blank=True, null=True)
    is_sent=models.IntegerField(blank=True, null=True)
    picture = models.ImageField(upload_to = 'pictures/%d/%m/%Y/',null=True, blank=True)

    def __str__(self):
        return str(self.te2chira_id)

form.py

from django import forms
from blog.models import te2chira, destination

class SaveTe2chira(forms.ModelForm):

    class Meta:
        model = te2chira
        fields = ['num','title', 'description','picture' ]

HTML

<form method="POST" class="form-style-9" enctype="multipart/form-data">
        {% csrf_token %}
        {{ form.as_p }}
<li>
 <input type="file" id="img" name="img"/>   
</li>
<li>
<input type="submit" class="field-style field-full align-none" id="save" value="save" />
 <script type="text/javascript">
             $(function(){
                $('#save').on('click',function(e){
                    e.preventDefault()
                    var formData = new FormData();
                    formData.append('num',$('#num').val())
                    formData.append('title',$('#title').val())
                    formData.append('text',$('#text').val())
                    formData.append('issent', 0)
                    formData.append('img', document.getElementById('img').files[0])



                $.ajax({
                    url:'/create/te2chira',
                    method:'POST',
                    data:formData,
                    processData:false,
                    contentType:false,
                    headers:{
                        'X-CSRFToken':'{{csrf_token}}'
                    }
                }).done(function(msg) {
                    document.location = "/creativePageSend.html"
                    alert('data saved')


                }).fail(function(err){
                    alert('no data was saved')
                })
            })
        })
</script>

</li>
    </ul>
</form>

прежде чем я добавлю поле изображения, JavaScript был:

<script type="text/javascript">
                 $(function(){
                    $('#save').on('click',function(e){
                        e.preventDefault()

                        num=$('#num').val()
                        title=$('#title').val()
                        text=$('#text').val()
                        issent=0
                    $.ajax({
                        url:'/create/te2chira',
                        method:'POST',
                        data: {
                            // y:year,
                            // d:date,
                            n:num,
                            ti:title,
                            te:text,
                            s:0
                        },
                        headers:{
                            'X-CSRFToken':'{{csrf_token}}'
                        }
                    }).done(function(msg) {
                        document.location = "/creativePageSend.html"
                        alert('data saved')


                    }).fail(function(err){
                        alert('no data was saved')
                    })
                })
            })
        </script>

views.py

def post_new(request):
    if request.method =='POST':
        form = SaveTe2chira(data = request.POST, files = request.FILES)
        if form.is_valid():
            print("valid form")
            form.save()
            id=form.te2chira_id
            print(id)
            request.session['idTe2chira']=id
            return render(request,'./creativePageSend.html',{'id':id})
        else:
            print("invalid form")

перед тем, как добавить поле изображения в форму, функция была:

def post_new(request):
    title = request.POST['ti']
    description = request.POST['te']
    num=request.POST['n']
    issent=request.POST['s']
    n=te2chira.objects.create(title=title,te2chira_date=timezone.datetime.now(),description=description,num=num,is_sent=issent)
    print(timezone.datetime.now())
    n.save()
    id=n.te2chira_id
    request.session['idTe2chira']=id
    return render(request,'./creativePageSend.html',{'id':id})

отправить форму со всеми полями и сохранить запись в базе данных

1 Ответ

0 голосов
/ 14 января 2019

SaveTe2chira - это форма, так как ошибка говорит, что форма не имеет атрибута "te2chira_id".

Я не совсем уверен, что вы пытаетесь сделать, но похоже, что вы хотите сохранить идентификатор вновь созданного объекта в сеансе. Таким образом, вам нужно использовать тот объект, который возвращается из вызова сохранения формы:

    if form.is_valid():
        obj = form.save()
        id = obj.te2chira_id
        request.session['idTe2chira'] = id

Обратите внимание, ваша функция Ajax done() кажется странной; Вы не можете перенаправить на шаблон, и в любом случае ваш вид уже возвращает отображаемое значение этого шаблона. Ваша готовая функция должна обновить страницу DOM, чтобы показать содержимое этого ответа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...