Выпадающий список Django заполняется из базы данных

#django #django-templates #django-views

#django #django-шаблоны #django-представления

Вопрос:

Если я передам элементы в шаблон через представление, и я хочу, чтобы пользователь выбрал одно из значений, которое отправляется в запись пользователя, у меня будет только цикл for в шаблоне, верно?

Как бы это выглядело? В шаблоне:

 <form method="POST" 
<select>

</select>
</form>
  

Модель:

 class UserItem(models.Model):
    user = models.ForeignKey(User)
    item = models.ForeignKey(Item)


class Item(models.Model):
    name = models.CharField(max_length = 50)
    condition = models.CharField(max_length = 50)
  

Вид:

 def selectview(request):
   item  = Item.objects.filter()
   form = request.POST
   if form.is_valid():
      # SAVE 

   return render_to_response (
   'select/item.html',
    {'item':item},
    context_instance = RequestContext(request)
               )
  

Комментарии:

1. Пожалуйста, предоставьте больше информации, например, какую модель, какие данные вы переносите в шаблон и т.д.

2. добавлена информация. пожалуйста, ознакомьтесь с изменениями. Спасибо

3. Прежде всего, я не могу достаточно рекомендовать вам использовать Django Forms ( docs.djangoproject.com/en/1.3/topics/forms ) — в частности, смотрите раздел «формы для моделей». Похоже, что вы могли это делать (я вижу if form.is_valid в вашем примере кода), но опубликованный вами код безумно искажен.

Ответ №1:

Если я правильно понял ваши потребности, вы можете сделать что-то вроде:

 <form method="POST">
<select name="item_id">
{% for entry in items %}
    <option value="{{ entry.id }}">{{ entry.name }}</option>
{% endfor %}
</select>
</form>
  

Кстати, вы должны указать название items вместо item , поскольку это коллекция (но это просто замечание ;)).

Таким образом, у вас будет список всех элементов в базе данных.

Затем, в сообщении, вот что вам нужно сделать:

 def selectview(request):
   item  = Item.objects.all() # use filter() when you have sth to filter ;)
   form = request.POST # you seem to misinterpret the use of form from django and POST data. you should take a look at [Django with forms][1]
   # you can remove the preview assignment (form =request.POST)
   if request.method == 'POST':
      selected_item = get_object_or_404(Item, pk=request.POST.get('item_id'))
      # get the user you want (connect for example) in the var "user"
      user.item = selected_item
      user.save()

      # Then, do a redirect for example

   return render_to_response ('select/item.html', {'items':item}, context_instance =  RequestContext(request),)
  

Конечно, не забудьте включить get_object_or_404

Комментарии:

1. Я знаю, что это устарело, так что это все еще лучший ответ? Я не нахожу это особенно СУХИМ, учитывая, что список выбора может использоваться в нескольких местах по всему сайту.

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

Ответ №2:

Вот более простой способ сделать это в 2021 году:

models.py

  from django.db import models

class Country(models.Model):
    name = models.CharField(max_length=30)

    def __str__(self):
        return self.name

class City(models.Model):
    country = models.ForeignKey(Country, on_delete=models.CASCADE)
    name = models.CharField(max_length=30)

    def __str__(self):
        return self.name

class Person(models.Model):
    name = models.CharField(max_length=100)
    birthdate = models.DateField(null=True, blank=True)
    country = models.ForeignKey(Country, on_delete=models.SET_NULL, null=True)
    city = models.ForeignKey(City, on_delete=models.SET_NULL, null=True)

    def __str__(self):
        return self.name
  

urls.py

 from django.urls import include, path

from . import views

urlpatterns = [
    path('', views.PersonListView.as_view(), name='person_changelist'),
    path('add/', views.PersonCreateView.as_view(), name='person_add'),
    path('<int:pk>/', views.PersonUpdateView.as_view(), name='person_change'),
]
  

views.py

 from django.views.generic import ListView, CreateView, UpdateView
from django.urls import reverse_lazy
from .models import Person

class PersonListView(ListView):
    model = Person
    context_object_name = 'people'

class PersonCreateView(CreateView):
    model = Person
    fields = ('name', 'birthdate', 'country', 'city')
    success_url = reverse_lazy('person_changelist')

class PersonUpdateView(UpdateView):
    model = Person
    fields = ('name', 'birthdate', 'country', 'city')
    success_url = reverse_lazy('person_changelist')
  

HTML

 {% extends 'base.html' %}

{% block content %}
  <h2>Person Form</h2>
  <form method="post" novalidate>
    {% csrf_token %}
    <table>
      {{ form.as_table }}
    </table>
    <button type="submit">Save</button>
    <a href="{% url 'person_changelist' %}">Nevermind</a>
  </form>
{% endblock %}
  

Результат:

введите описание изображения здесь

Ссылка: https://simpleisbetterthancomplex.com/tutorial/2018/01/29/how-to-implement-dependent-or-chained-dropdown-list-with-django.html