django - establecer el valor inicial en CreateView desde ForeignKey(non-self.request.user)
django-templates foreign-keys (1)
Necesitas crear una instancia de tu receta:
class IngredientAddView(CreateView):
model=Ingredient
def get_initial(self):
recipe = get_object_or_404(Recipe, slug=self.kwargs.get(''slug''))
return {
''recipe'':recipe,
}
Estoy intentando acceder a ForeignKeys en las vistas basadas en clase CreateView. Me gustaría poder establecer dinámicamente los valores iniciales en CBV desde ForeignKeys y también establecer dinámicamente enlaces de plantilla desde ForeignKeys.
Estas dos preguntas (1. valores iniciales, 2. enlaces de plantilla) pueden resolverse con métodos similares, o quizás con métodos diferentes ... Todavía estoy aprendiendo. Tal vez la primera pregunta se pueda resolver dentro de views.py
y la segunda se pueda resolver con la sintaxis de la plantilla en ingredient_form.html
?
He visto preguntas sobre el establecimiento de valores iniciales de SO de los usuarios ( self.request.user
), pero no solo de una clave externa normal en models.py
.
Estoy revisando django-by-errors e intentando agregar funciones adicionales para expandir mi conocimiento de django.
Mi pregunta se centra específicamente en views.py:IngredientAddView(CreateView)
, en views.py:IngredientAddView(CreateView)
, y en urls.py:''recipe-detail''
& ''ingredient-add
''.
Cuando veo un ''recipe-detail''
, puedo hacer clic en un enlace para ''ingredient-add''
. Me gustaría ''ingredient-add''
a "saber" en qué receta hizo clic y ser capaz de establecer esta receta como el valor inicial (mi intento en views.py:IngredientAddView:get_initials(self)
no funciona), y también Podré enlazar de nuevo a esta receta (mi intento dentro de ingredient_form.html:{% comment %}
no funciona).
Agradecería cualquier ayuda.
modelos.py
class Food(models.Model):
name=models.CharField(max_length=20,unique=True)
def __str__(self):
return self.name
def get_absolute_url(self):
return reverse(''food-detail'',kwargs={''pk'':self.pk})
class Recipe(models.Model):
title=models.CharField(max_length=80,unique=True)
slug=models.SlugField(max_length=80,unique=True)
description=models.TextField(blank=True)
def __str__(self):
return self.title
def get_absolute_url(self):
return reverse(''recipe-detail'',kwargs={''slug'':self.slug})
class Ingredient(models.Model):
recipe=models.ForeignKey(Recipe)
food=models.ForeignKey(Food)
def __str__(self):
return ''%s (%s)'' % (self.food, self.recipe)
vistas.py
class FoodListView(ListView):
model=Food
class FoodDetailView(DetailView):
model=Food
class FoodCreateView(CreateView):
model=Food
class RecipeListView(ListView):
model=Recipe
class RecipeDetailView(DetailView):
model=Recipe
class RecipeCreateView(CreateView):
model=Recipe
class RecipeUpdateView(UpdateView):
model=Recipe
class IngredientAddView(CreateView):
model=Ingredient
# def get_context_data(self,**kwargs):
# context=super(IngredientAddView,self).get_context_data(**kwargs)
# context[''foreign'']=self.request.session.get(''slug'')
def get_initials(self):
return {
''recipe'':self.request.session.get(''recipe'')
}
urls.py
from .views import FoodListView, FoodDetailView, FoodCreateView, RecipeListView, RecipeDetailView, RecipeCreateView, RecipeUpdateView, IngredientAddView
urlpatterns=patterns('''',
url(r''^$'',RecipeListView.as_view(),name=''recipe-list''),
url(r''^(?P<slug>[-/w]+)$'',RecipeDetailView.as_view(),name=''recipe-detail''),
url(r''^(?P<slug>[-/w]+)/edit$'',RecipeUpdateView.as_view(),name=''recipe-edit''),
url(r''^(?P<slug>[-/w]+)/add_ingredient/$'',IngredientAddView.as_view(),name=''ingredient-add''),
url(r''^new/$'',RecipeCreateView.as_view(),name=''recipe-create''),
url(r''^food/$'',FoodListView.as_view(),name=''food-list''),
url(r''^food/(?P<pk>[/d]+)$'',FoodDetailView.as_view(),name=''food-detail''),
url(r''^food/create/$'',FoodCreateView.as_view(),name=''food-create''),
)
recipe_detail.html
{% extends "base_food.html" %}
{% block title %}{{ recipe }} {% endblock %}
{% block content %}
<h1>{{ recipe }}</h1>
<p>{{ recipe.id }}</p>
<p>{{ recipe.title }}</p>
<br>
<h2>Description</h2>
<p>{{ recipe.description|default:''No description'' }}</p>
<h2>Ingredients</h2>
<ul>
{% for ingredient in recipe.ingredient_set.all %}
<li>{{ ingredient }}</li>
{% endfor %}
</ul>
<p><a href="{% url ''ingredient-add'' recipe.slug %}">Add ingredient</a></p>
<p><a href="{% url ''recipe-edit'' recipe.slug %}">Edit recipe</a></p>
<p><a href="{% url ''recipe-list'' %}">Back to recipe list</a></p>
{% endblock %}
ingrediente_form.html
{% extends "base_food.html" %}
{% block title %}Add Ingredient{% endblock %}
{% block content %}
<h1>Add Ingredient</h1>
<form method="POST">{% csrf_token %}
{{ form }}
<button type="submit" class="btn btn-primary">Save</button>
</form>
{%comment%} <p><a href="{% url ''recipe-detail'' recipe.slug %}">Back to detail</a></p> {%endcomment%}
<p><a href="{% url ''recipe-list'' %}">Back to recipe list</a></p>
{% endblock %}