AD

Django помогите, не соединяется заказ с покупателем

  • Есть форма, с заказом, т.е. должно быть так что авторизованный пользователь делает заказ, и в его профиле отображаются его заказы, т.е. название товара.
    Но проблема в том, если делать заказ через админку и сразу ставить покупателя, то в профиле отображаются покупки, а вот через саму форму нет, выдает ошибку
    IntegrityError at /BoxShop/
    (1048, "Column 'author_id' cannot be null")

    т.е. поле автора(покупателя) не может быть пусто, но вроде как во view я указал ((  в общем вот код


    class Zayavka(models.Model):
        GEEKS_CHOICES = (
            ("Sweet БОКС", "Sweet БОКС"),
            ("СЮРПРИЗ БОКС", "СЮРПРИЗ БОКС"),
            ("Блогер бокс", "Блогер бокс"),
            ("8 Марта бокс", "8 Марта бокс"),
            ("Halloween бокс", "Halloween бокс"),
            ("14 февраля бокс", "14 февраля бокс"),
            ("Новогодний бокс", "Новогодний бокс"),
            # ("Пепси", "Пепси"),
            # ("Макси чай", "Макси чай"),
        )

        tovar = models.CharField('Товат', max_length=50, choices=GEEKS_CHOICES)
        kolvo = models.IntegerField('Количество')
        subject = models.CharField('Тема', max_length=100)
        sender = models.EmailField('Email', max_length=50)
        message = models.TextField('Сообщение')
        author = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)

        def __str__(self):
            return self.tovar

    class ContactForm(forms.ModelForm):
        class Meta:
            model = Zayavka
            fields = ('tovar','kolvo','subject','sender','message')


    def contactform(request):
        if request.method == 'POST':
            form = ContactForm(request.POST)
            if form.is_valid():
                tovar = form.cleaned_data['tovar']
                kolvo = form.cleaned_data['kolvo']
                subject = form.cleaned_data['subject']
                sender = form.cleaned_data['sender']
                message = form.cleaned_data['message']             recepients = ['forli00@mail.ru']

                try:
                    send_mail(subject,
                              'Имя: ' + subject + '\n' 'Номер телефона: ' + message + '\n' + 'Email: ' + sender + '\n' + 'Товар: ' + tovar + '\n' + 'Количество: ' + str(
                                  kolvo), 'forli00@mail.ru', recepients)
                except BadHeaderError:
                    return HttpResponse('Invalid header found')
                form.save()
                return redirect('thanks')
        else:
            form = ContactForm()
        return render(request,'Main.html',{'form':form})


    Профиль:

    def account_view(request):
        if not request.user.is_authenticated:
            return redirect('feedback')

        context = {}

        zayavki = Zayavka.objects.filter(author=request.user) # Вот здесь я определяю, что заявка должна быть прикреплена к юзеру.
        context['zayavki'] = zayavki

        return render(request,'account.html',context)

     

     

    p.s. Не душите плиз за говнокод, создал копию основного проекта и тестил кое что, по этому все так безобразно, а еще сидел часа 3 пытался сделать, было много ошибок, и вот остановился на главной, не знаю уже что делать((

  • Какой ужос, ни объяснил нормально, ни код нормально не показал. Python developer )000

    Можешь нормально объяснить что не так? и код выложить куда-то

    1. Что надо сделать.

    2. Что вышло

    3. Что пытался сделать, чтобы исправить(если пытался)

    4. Код ссылкой

  • Автор темы
    Till_Its_Gone сказал(а):

    Какой ужос, ни объяснил нормально, ни код нормально не показал. Python developer )000

    Можешь нормально объяснить что не так? и код выложить куда-то

    Нажмите, чтобы раскрыть...

    Я прост такой же вопрос задал на хабре, там все нормально выглядит, я думал тут теги такие же под питон будут, и тупо скопировал

    Ну так объяснил же вроде как то(( 

    Вот есть у меня модель заявка, ее может подавать залогинный пользователь, я к модели подключил пользователя, т.е. у каждой заявки, ЕСТЬ АВТОР, т.е. тот кто подал эту заявку, я создал форму чтобы пользователь мог отправлять заявку, она отправляется, все работает, но есть одно НО, когда она отправляется, выдает поле с ошибкой базы данных, в которой говорится что поле АВТОР пустое, и я вот не понимаю почему оно пустое, когда в модели я указал что у каждой заявки должен быть автор, но оно все равно говорит что поле пустое.

    И в профиле не показывается эта заявка. НО, если я через админку зайду в заявки, создам новую заявку, и в поле автор выберу автора, то в профиле этого автора тогда показывается данная заявка, а через форму нет. А мне надо чтобы через форму это все отображалось.

    Я не знаю как еще подробней объяснить(( Вот пост на хабре может там код лучше смотрится) https://qna.habr.com/q/778587


    Скорее я чего то не дописал или еще что то, ибо я неопытный, но по моей логике я сделал все верно, указал что у каждой заявки должен быть автор author = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE), и по идеи все должно быть так что пользователь авторизовался, подает заявку, и он автор этой заявки, но база данных ругает что автор не указан, вот в этом проблема((( 

  • Batyaaa сказал(а):

    Есть форма, с заказом, т.е. должно быть так что авторизованный пользователь делает заказ, и в его профиле отображаются его заказы, т.е. название товара.
    Но проблема в том, если делать заказ через админку и сразу ставить покупателя, то в профиле отображаются покупки, а вот через саму форму нет, выдает ошибку
    IntegrityError at /BoxShop/
    (1048, "Column 'author_id' cannot be null")

    т.е. поле автора(покупателя) не может быть пусто, но вроде как во view я указал ((  в общем вот код


    class Zayavka(models.Model):
        GEEKS_CHOICES = (
            ("Sweet БОКС", "Sweet БОКС"),
            ("СЮРПРИЗ БОКС", "СЮРПРИЗ БОКС"),
            ("Блогер бокс", "Блогер бокс"),
            ("8 Марта бокс", "8 Марта бокс"),
            ("Halloween бокс", "Halloween бокс"),
            ("14 февраля бокс", "14 февраля бокс"),
            ("Новогодний бокс", "Новогодний бокс"),
            # ("Пепси", "Пепси"),
            # ("Макси чай", "Макси чай"),
        )

        tovar = models.CharField('Товат', max_length=50, choices=GEEKS_CHOICES)
        kolvo = models.IntegerField('Количество')
        subject = models.CharField('Тема', max_length=100)
        sender = models.EmailField('Email', max_length=50)
        message = models.TextField('Сообщение')
        author = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)

        def __str__(self):
            return self.tovar

    class ContactForm(forms.ModelForm):
        class Meta:
            model = Zayavka
            fields = ('tovar','kolvo','subject','sender','message')


    def contactform(request):
        if request.method == 'POST':
            form = ContactForm(request.POST)
            if form.is_valid():
                tovar = form.cleaned_data['tovar']
                kolvo = form.cleaned_data['kolvo']
                subject = form.cleaned_data['subject']
                sender = form.cleaned_data['sender']
                message = form.cleaned_data['message']             recepients = ['forli00@mail.ru']

                try:
                    send_mail(subject,
                              'Имя: ' + subject + '\n' 'Номер телефона: ' + message + '\n' + 'Email: ' + sender + '\n' + 'Товар: ' + tovar + '\n' + 'Количество: ' + str(
                                  kolvo), 'forli00@mail.ru', recepients)
                except BadHeaderError:
                    return HttpResponse('Invalid header found')
                form.save()
                return redirect('thanks')
        else:
            form = ContactForm()
        return render(request,'Main.html',{'form':form})


    Профиль:

    def account_view(request):
        if not request.user.is_authenticated:
            return redirect('feedback')

        context = {}

        zayavki = Zayavka.objects.filter(author=request.user) # Вот здесь я определяю, что заявка должна быть прикреплена к юзеру.
        context['zayavki'] = zayavki

        return render(request,'account.html',context)

     

     

    p.s. Не душите плиз за говнокод, создал копию основного проекта и тестил кое что, по этому все так безобразно, а еще сидел часа 3 пытался сделать, было много ошибок, и вот остановился на главной, не знаю уже что делать((

    Нажмите, чтобы раскрыть...

    Начнем с того что тебя нужно наказать за русские название полей в модели

    choices на русском тоже наказать

    А по сабжу

    у тебя в форме не передается author_id, а он у тебя обязателен в модели. Так що тебе в форму нужно и его проборасывать, и имей совесть, скидывай код на pastebin или еще куда-нибудь.


    Он же тебе даже это в ошибке написал

    Batyaaa сказал(а):

    "Column 'author_id' cannot be null"

    Нажмите, чтобы раскрыть...

     


    за FBV тоже наказать


    За отправку email не таской в селери тоже наказать

  • Batyaaa сказал(а):

    Я прост такой же вопрос задал на хабре, там все нормально выглядит, я думал тут теги такие же под питон будут, и тупо скопировал

    Ну так объяснил же вроде как то(( 

    Вот есть у меня модель заявка, ее может подавать залогинный пользователь, я к модели подключил пользователя, т.е. у каждой заявки, ЕСТЬ АВТОР, т.е. тот кто подал эту заявку, я создал форму чтобы пользователь мог отправлять заявку, она отправляется, все работает, но есть одно НО, когда она отправляется, выдает поле с ошибкой базы данных, в которой говорится что поле АВТОР пустое, и я вот не понимаю почему оно пустое, когда в модели я указал что у каждой заявки должен быть автор, но оно все равно говорит что поле пустое.

    И в профиле не показывается эта заявка. НО, если я через админку зайду в заявки, создам новую заявку, и в поле автор выберу автора, то в профиле этого автора тогда показывается данная заявка, а через форму нет. А мне надо чтобы через форму это все отображалось.

    Я не знаю как еще подробней объяснить(( Вот пост на хабре может там код лучше смотрится) https://qna.habr.com/q/778587

     

    Скорее я чего то не дописал или еще что то, ибо я неопытный, но по моей логике я сделал все верно, указал что у каждой заявки должен быть автор author = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE), и по идеи все должно быть так что пользователь авторизовался, подает заявку, и он автор этой заявки, но база данных ругает что автор не указан, вот в этом проблема((( 

    Нажмите, чтобы раскрыть...

    продебаж.

    т.е. брейкпоинт на точке где поисходит запись автора в объект заявки и посмотри что там

  • У тебя в модели внешний ключ author на юзера, а ты пытаешься сохранить форму этой модели без юзера.

    https://stackoverflow.com/questions/11639391/saving-django-modelform-with-a-foreignkey

     

    P.S. Вот телеграмм канал по джанге, задавай вопросы там.

    P.P.S. Вот доки твоего вопроса: https://docs.djangoproject.com/en/3.0/topics/forms/modelforms/#inline-formsets 

  • Dr.Geologist сказал(а):

    Начнем с того что тебя нужно наказать за русские название полей в модели

    choices на русском тоже наказать

    А по сабжу

    у тебя в форме не передается author_id, а он у тебя обязателен в модели. Так що тебе в форму нужно и его проборасывать, и имей совесть, скидывай код на pastebin или еще куда-нибудь.

     

    Он же тебе даже это в ошибке написал

     

     

    за FBV тоже наказать

     

    За отправку email не таской в селери тоже наказать

    Нажмите, чтобы раскрыть...

    челик ты реально больной ))) разве кто-то спрашивал твое авторитетное мнение? на тему бест практик ?

  • Hy6o_Hy6 сказал(а):

    челик ты реально больной ))) разве кто-то спрашивал твое авторитетное мнение? на тему бест практик ?

    Нажмите, чтобы раскрыть...

    Какбэ не спрашивали, но код такого уровня доходил до меня, и в этой наркомании приходилось разбираться, так что считаю своим священным долгом оставлять такие заметки дабы уменьшить мучение других людей которым перепадет этот код.

    Я же не стал егооскорблять, я написал конкретные места накоторые нужно обратитьвнимание в будущем.

Кто смотрит тему (Пользователи: 0, Гости: 0)