Si vous voulez toutes les fonctionnalités de la vue générique, vous pouvez simplement créer une nouvelle vue générique en utilisant l'original comme modèle.
Par exemple:
def create_object_with_initial(request, model=None, template_name=None,
template_loader=loader, extra_context=None, post_save_redirect=None,
login_required=False, context_processors=None, form_class=None, initial=None):
if extra_context is None: extra_context = {}
if login_required and not request.user.is_authenticated():
return redirect_to_login(request.path)
model, form_class = get_model_and_form_class(model, form_class)
if request.method == 'POST':
form = form_class(request.POST, request.FILES)
if form.is_valid():
new_object = form.save()
msg = ugettext("The %(verbose_name)s was created successfully.") %\
{"verbose_name": model._meta.verbose_name}
messages.success(request, msg, fail_silently=True)
return redirect(post_save_redirect, new_object)
else:
print "creating", form_class, " with initial data ", initial
form = form_class(initial=initial)
# Create the template, context, response
if not template_name:
template_name = "%s/%s_form.html" % (model._meta.app_label, model._meta.object_name.lower())
t = template_loader.get_template(template_name)
c = RequestContext(request, {
'form': form,
}, context_processors)
apply_extra_context(extra_context, c)
return HttpResponse(t.render(c))
Ceci est copié à partir /site-packages/django/views/generic/create_update.py avec des lignes seulement 3 et 21 changements pour incorporer les données initiales.
Utilisez ensuite comme on pouvait s'y attendre:
object_info = {
'model': YourModel,
'initial': {'data' : 'Initial Value'},
'template_name': 'template.html'
}
url(r'^path/$',
login_required(create_object_with_initial),
object_info,
name='url_name'),
Cela devrait fonctionner.
Je ne comprends pas vraiment le but de ceci, mais avez-vous regardé les variables template_name et extra_content? Mais sérieusement, pourquoi ne pas écrire une page/formulaire html et arrêter d'essayer de trouver des façons génériques de faire cela. Si vous avez besoin de définir une valeur particulière (comme l'utilisateur) dans un formulaire, vous êtes déjà en train de programmer pour un cas très spécifique. – drozzy