django Custom ManyToMany экономит на модели Formset Options - PullRequest
1 голос
/ 18 июля 2010

У меня есть набор форм, который настроен для использования таблицы соединений.Таблица соединения объединяет таблицу рецептов и таблицу ингредиентов и выглядит следующим образом:

class RecipeIngredient(models.Model): 
    '''intermediate model between Ingredient and recipe.models.recipe 
for many to many''' 
    quantity =  models.IntegerField() 
    measurement = models.CharField(max_length=200) 
    ingredient = models.ForeignKey(Ingredient) 
    preparation = models.CharField(max_length=100, blank=True, 
null=True) 
    recipe    = models.ForeignKey(Recipe) 

Я создал набор форм примерно так:

IngFormSet = inlineformset_factory(Recipe, RecipeIngredient, 
formset=BaseIngFormSet, extra=5) 

BaseIngFormSet был создан, чтобы включить раскрывающееся меню по умолчанию.для поля ингредиента (многие ко многим с таблицей ингредиентов), в поле ввода, чтобы позже я мог использовать jquery-autocomplete в поле ввода.Это сэкономит время пользователям, вынужденным прокручивать очень длинный список ингредиентов для выбора.

class BaseIngFormSet(BaseModelFormSet): 
    def add_fields(self, form, index): 
        super(BaseIngFormSet, self).add_fields(form,index) 
        form.fields["ingredient"] = forms.CharField() 

Эта часть, на которой я в данный момент застрял, заключается в том, что при отправке формы происходит сбой, поскольку ингредиент больше не находится в экземпляре таблицы ингредиентов

Невозможно назначитьu'Ground Turkey '": RecipeIngredient.ingredient" должен быть экземпляром "Ingredient".

Я подумал, что мне нужно взять то, что набрано в поле ввода, а затем выполнить поиск по немумодель Ingredient что-то вроде Ingredient.objects.get (title = "blah")

Затем каким-то образом установите этот объект равным RecipeIngredient.ingredient в наборе форм перед проверкой набора форм.К сожалению, я не знаю, где и как это сделать.Я попытался зайти в оболочку и настроить набор форм, а затем выполнил на нем dir (набор форм), чтобы выяснить, сможет ли это пролить свет на мою проблему, но я ничего не придумал.У кого-нибудь есть какие-либо предложения о том, как взять то, что передается во входных данных для набора форм, и превратить это в объект из таблицы ингредиентов?Я знаю, что в какой-то момент пользователь может ввести ингредиент, которого нет в базе данных, и я планирую выполнить поиск того, что передано, и если его нет в базе данных, я бы его создал, а затем передал этот новыйвозражать против formset.Вот что я сейчас имею в виду для этой формы

from django.shortcuts import render_to_response, get_object_or_404, 
get_list_or_404, redirect 
from django.template import RequestContext 
from django.contrib.auth.decorators import login_required 
from django.forms.models import modelformset_factory, 
inlineformset_factory 
from models import Recipe, RecipeIngredient 
from ingredient.models import Ingredient 
from forms import RecipeForm, BaseIngFormSet 
@login_required 
def recipe(request): 
    IngFormSet = inlineformset_factory(Recipe, RecipeIngredient, 
formset=BaseIngFormSet, extra=5) 
    if request.method=='POST': 
        form = RecipeForm(request.POST, request.FILES) 
        formset = IngFormSet(request.POST) 
        if form.is_valid() and formset: 
            new_recipe = form.save() 
            instances = formset.save(commit=False) 
            for instance in instances: 
                instance.recipe_id = new_recipe.id 
                instance.save() 
            return redirect(new_recipe.get_absolute_url()) 
    else: 
        form = RecipeForm() 
        formset = IngFormSet(queryset=RecipeIngredient.objects.none()) 
    return render_to_response('recipe/recipe_form.html', {'form': 
form, 'formset' : formset,}, context_instance=RequestContext(request)) 

Спасибо за любую помощь, которую вы можете оказать.

1 Ответ

0 голосов
/ 21 июля 2010

Рассматривали ли вы использование виджета, который не требует дальнейшего взлома проверки Возможно, что-то вроде http://code.google.com/p/django-ajax-selects/? Если это не совсем подходит, взгляните на файл fields.py и их пользовательские поля формы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...