#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 %}
Результат: