@darkglare

Как сделать автозаполнение поля формы?

Как сделать так, чтобы при заполнении формы заказа в поле "Nickname" автоматически вписывался id авторизованного сейчас пользователя. Либо его Логин, но ЛОГИН должен соответствовать своему id в Базе данных.
Сейчас форма выводится так,что если пользователь хочет оформить заказ,то ему предлагается ввести свой ID ,который автоматом создается в БД при регистрации. Конечно пользователь его не знает. Нужно передать id авторизованного пользователя в поле nickname

models.py

from django.db import models
import django
from shop.models import Product
from django.contrib.auth.models import User

class Order(models.Model):
    nickname = models.ForeignKey(User, on_delete=models.CASCADE)
    email = models.EmailField()
    postal_code = models.CharField(max_length=20)
    city = models.CharField(max_length=100)
    street = models.CharField(max_length=100, default="s")
    created = models.DateTimeField(auto_now_add=True)
    updated = models.DateTimeField(auto_now=True)
    paid = models.BooleanField(default=False)

    class Meta:
        ordering = ('-created',)
        verbose_name = 'Заказ'
        verbose_name_plural = 'Заказы'

    def __str__(self):
        return 'Order {}'.format(self.id)

    def get_total_cost(self):
        return sum(item.get_cost() for item in self.items.all())


class OrderItem(models.Model):
    
    order = models.ForeignKey(Order, related_name='items')
    product = models.ForeignKey(Product, related_name='order_items')
    price = models.DecimalField(max_digits=10, decimal_places=2)
    quantity = models.PositiveIntegerField(default=1)
    

    def __str__(self):
        return '{}'.format(self.id)

    def get_cost(self):
        return self.price * self.quantity


views.py

def order_create(request):
    cart = Cart(request)
    if request.method == 'POST':
        form = OrderCreateForm(request.POST)
        if form.is_valid():
            
            order = form.save() 

            for item in cart:
                OrderItem.objects.create(order=order,
                                         product=item['product'],
                                         price=item['price'],
                                         quantity=item['quantity'])
            # очистка корзины
            cart.clear()
            return render(request, 'orders/order/created.html',
                          {'order': order})
    else:
        form = OrderCreateForm
        
    return render(request, 'orders/order/create.html',
                  {'cart': cart, 'form': form})


forms.py

from django import forms
from .models import Order
from django.contrib.auth.models import User


class OrderCreateForm(forms.ModelForm):
    class Meta:
        model = Order
        fields = ['nickname', 'email',  'postal_code', 'city', 'street',]
        widgets = {
            'nickname': forms.TextInput(attrs={"class": "form-control", "placeholder": "Имя"}),
            
            'email': forms.EmailInput(attrs={"class": "form-control", "placeholder": "e-mail"}),
            'postal_code': forms.TextInput(attrs={"class": "form-control", "placeholder": "Почтовый индекс"}),
            'city': forms.TextInput(attrs={"class": "form-control", "placeholder": "Город"}),
            'street': forms.TextInput(attrs={"class": "form-control", "placeholder": "Улица"}),

            }


admin.py

from django.contrib import admin
from .models import Order, OrderItem

class OrderItemInline(admin.TabularInline):
    model = OrderItem
    raw_id_fields = ['product']


class OrderAdmin(admin.ModelAdmin):
    list_display = ['id', 'nickname' ,'email',
                     'postal_code', 'city', 'paid',
                    'created', 'updated']
    list_filter = ['paid', 'created', 'updated']
    inlines = [OrderItemInline]

admin.site.register(Order, OrderAdmin)


html

<form action="." method="post" class="order-form">

 {{form.as_p}}

</form>
  • Вопрос задан
  • 1331 просмотр
Пригласить эксперта
Ответы на вопрос 2
@darkglare Автор вопроса
Решение

class OrderCreateForm(forms.ModelForm):
    class Meta:
        model = Order
        fields = [ 'email',  'postal_code', 'city', 'street',]
        widgets = {
             'email': forms.EmailInput(attrs={"class": "form-control", "placeholder": "e-mail"}),
            'postal_code': forms.TextInput(attrs={"class": "form-control", "placeholder": "Почтовый индекс"}),
            'city': forms.TextInput(attrs={"class": "form-control", "placeholder": "Город"}),
            'street': forms.TextInput(attrs={"class": "form-control", "placeholder": "Улица"}),
 
            }


def order_create(request):
    cart = Cart(request)
    if request.method == 'POST':
        form = OrderCreateForm(request.POST)
        if form.is_valid():
            order = form.save(commit=False)
            order.nickname = request.user
            order.save()
            for item in cart:
                OrderItem.objects.create(order=order,
                                         product=item['product'],
                                         price=item['price'],
                                         quantity=item['quantity'])
            # очистка корзины
            cart.clear()
            return render(request, 'orders/order/created.html',
                          {'order': order})
    else:
        form = OrderCreateForm
    return render(request, 'orders/order/create.html',
                  {'cart': cart, 'form': form})
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы