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

avatar Batyaaa

464

7

Batyaaa

Пользователь

Регистрация: 22.03.2016

Сообщения: 9

Рейтинг: 0

Batyaaa

Регистрация: 22.03.2016

Сообщения: 9

Рейтинг: 0

Есть форма, с заказом, т.е. должно быть так что авторизованный пользователь делает заказ, и в его профиле отображаются его заказы, т.е. название товара.

Но проблема в том, если делать заказ через админку и сразу ставить покупателя, то в профиле отображаются покупки, а вот через саму форму нет, выдает ошибку

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 пытался сделать, было много ошибок, и вот остановился на главной, не знаю уже что делать((

Till_Its_Gone

Пользователь

Регистрация: 14.04.2020

Сообщения: 562

Рейтинг: -2

Нарушения: 100

Till_Its_Gone

Регистрация: 14.04.2020

Сообщения: 562

Рейтинг: -2

Нарушения: 100

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

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

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

2. Что вышло

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

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

Batyaaa

Пользователь

Регистрация: 22.03.2016

Сообщения: 9

Рейтинг: 0

Batyaaa

Регистрация: 22.03.2016

Сообщения: 9

Рейтинг: 0

Till_Its_Gone сказал(а):

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

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

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

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

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

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

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

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

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

Dr.Geologist

Пользователь

Регистрация: 21.12.2015

Сообщения: 1183

Рейтинг: 773

Dr.Geologist

Регистрация: 21.12.2015

Сообщения: 1183

Рейтинг: 773

img
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 не таской в селери тоже наказать

Till_Its_Gone

Пользователь

Регистрация: 14.04.2020

Сообщения: 562

Рейтинг: -2

Нарушения: 100

Till_Its_Gone

Регистрация: 14.04.2020

Сообщения: 562

Рейтинг: -2

Нарушения: 100

Batyaaa сказал(а):

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

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

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

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

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

 

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

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

продебаж.

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

Hit Girl

Пользователь

Регистрация: 10.12.2014

Сообщения: 4216

Рейтинг: 2061

Hit Girl

Регистрация: 10.12.2014

Сообщения: 4216

Рейтинг: 2061

У тебя в модели внешний ключ 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 

Hy6o_Hy6

Пользователь

Регистрация: 16.11.2013

Сообщения: 3540

Рейтинг: 2188

Hy6o_Hy6

Регистрация: 16.11.2013

Сообщения: 3540

Рейтинг: 2188

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

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

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

А по сабжу

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

 

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

 

 

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

 

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

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

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

Dr.Geologist

Пользователь

Регистрация: 21.12.2015

Сообщения: 1183

Рейтинг: 773

Dr.Geologist

Регистрация: 21.12.2015

Сообщения: 1183

Рейтинг: 773

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

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

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

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

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