Django - передать значение из шаблона в функцию views - PullRequest
1 голос
/ 25 февраля 2020

Я Django новичок, и я столкнулся с проблемой, которую я не совсем уверен, как решить. Я создаю сайт электронной коммерции для практики. У меня есть две основные модели: Товар, Товар. Где продукт имеет значение - память, цвет, код, доступность и т. Д. c. Элемент является оберткой для нескольких продуктов, поэтому пользователь может просматривать несколько продуктов, упакованных в один.

, то есть:

Продукты: мобильный телефон 128 ГБ, белый; Мобильный телефон, 64 ГБ черного; ...

Элемент: Мобильный телефон (с белыми 128 ГБ и черными "указателями" 64 ГБ)

Так как мой ItemDetailView (DetailView) я показываю пользователю Предмет, может, конечно, показать все возможные цвета и варианты памяти. Но я не могу понять, как на самом деле после того, как пользователь выбирает, например, с помощью радиокнопок, в шаблоне. html страница, цвет и память отправляют выбранный вариант на сервер (или views.py, если я правильно понимаю концепцию ).

Моя идея состояла в том, чтобы создать модель "ChosenProduct", содержащую столбцы типа "пользователь", "цвет", "память", "элемент". Поэтому, выбрав цвет и память, я в идеале мог бы создать новый объект, содержащий все четыре параметра. С этим я мог показать пользователю, что он доступен, и после нажатия «добавить в корзину», добавив его в корзину ...

Но проблема в том, что я не знаю, как легко передать эти параметры (цвет, size), который пользователь выбирает из шаблона. html для фактической функции, которая обрабатывает это.

models.py

#presenting actual Product for sale
class Product(models.Model):
    code = models.CharField(max_length=30)
    colorCode = models.CharField(max_length=20, blank=True, null=True)
    rgb = models.CharField(max_length=20, blank=True, null=True)
    sizeCode = models.CharField(max_length=20, blank=True, null=True)
    avalibility = models.IntegerField(default=0)

    def __str__(self):
        return self.code


#wraps multiple Products
class Item(models.Model):
    title = models.CharField(max_length=100)
    description = models.CharField(max_length=10000)
    price_inclVat = models.FloatField()
    price_noVat = models.FloatField()
    price_discount_inclVat = models.FloatField(blank=True, null=True)
    price_discount_notVat = models.FloatField(blank=True, null=True)
    products = models.ManyToManyField(Product)
    slug = models.SlugField()
    label = models.CharField(choices=LABEL_CHOICES,
                             max_length=1, null=True, blank=True)


#my idea of presenting chosen variants in user's relation
class ChosenProduct(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL,
                             on_delete=models.CASCADE)
    color = models.CharField(max_length=20, blank=True)
    size = models.CharField(max_length=20, blank=True)
    item = models.ForeignKey(Item, on_delete=models.CASCADE)

    def __str__(self):
        return self.item.title

views.py (DetailView )

class ItemDetailView(DetailView):
    model = Item
    template_name = "product.html"

Не могли бы вы указать мне правильное направление и как выполнить эту операцию, используя Django? Я нашел несколько потоков, обсуждающих request.GET, но я не хочу передавать параметры через URL (так как это только из моего понимания).

Спасибо!

Ответы [ 2 ]

0 голосов
/ 25 февраля 2020

Вы правы, предполагая, что вы не должны размещать данные, используя URL. Я предполагаю, что вы понимаете django формы. Если нет, пожалуйста, ознакомьтесь с django формой документации . Теперь вам нужно отобразить форму в шаблоне деталей, эта форма будет содержать все ваши параметры, а что нет. Клиент отправит форму с кнопкой «Добавить в корзину» или «Купить». Отправляя эту форму, клиент отправит все выбранные опции на ваш django бэкэнд.

#views.py
class ItemDetailView(SuccessMessageMixin, generic.DetailView):
    template_name = 'product.html'
    queryset = models.Item.objects.all()

   def get_context_data(self, **kwargs):
      context = super().get_context_data(**kwargs)
      context['title'] = "Details of Product: "
      context['item_form'] = forms.AddtoCart(instace=self.object)#* or use other ways to pass initial or default value to form
      return context

#forms.py
class AddToCart(forms.ModelForm):
   itemCode = forms.CharField(widget=forms.HiddenInput())
   itemoption = forms.BooleanField(label='Name', required=True, 
          widget=forms.CheckboxInput(
             attrs={
                     'placeholder': 'options are here '
                   }
            ))
 #etc


class Meta:
    model = Choosen_Item
    fields = ['itemCode', 'itemoption' ]
    # exclude = ['inputter', 'updater', 'updateOn']

#product.html
# skipped some code for brevity
<form action='url to where you want to process the submitted data'>
 {% csrf_token %}
 {{ item_form.as_p}}
 <button>Add to cart</button>
</form>

Все это предполагает, что вы не используете drf, а также не используете какой-либо интерфейсный фреймворк. Надеюсь, это поможет !!

0 голосов
/ 25 февраля 2020

это может вам помочь. напишите это на ваших взглядах и укажите на него URL

from django.shortcuts import render
def indexw(request):
    context_variable = ''
    context = {"context_variable": context_variable}
    return render(request,'index.html', context)
...