Photographer
モデルから値の辞書を取得してフォームに表示しようとしています。その後、ユーザーが を選択しPhotographer
、フォームを (他の情報と共に) 送信すると、モデルのインスタンスが を属性としてA
作成されPhotographer
ます。ModelForms の方が使いやすいことは理解していますが、この場合は BaseForm を使用する必要があります。
@login_required
def create_in(request, slug):
element = get_object_or_404(Element, slug=slug)
a = A.objects.create(element=element, user=request.user)
a.save()
return redirect('CreationEditView', pk=a.pk)
ユーザーが選択した場所に urlconf
ユーザーを送信し、Django Generic Views の BaseUpdateView を使用してオブジェクトを操作する場所にリダイレクトされます。create_in,
element
CreationEditView,
class EditView(BaseUpdateView):
model = A
form_class = AForm
context_object_name = 'a'
page = 'edit.html'
def get_element(self):
return self.object.element
def render_to_response(self, context, **response_kwargs):
element = self.get_element()
return render_page(self.request, element,
self.page, context)
def get_success_url(self):
return reverse('view_all')
def get_context_data(self, **kwargs):
context = super(EditView, self).get_context_data(**kwargs)
return context
def get_queryset(self):
qs = super(EditView, self).get_queryset()
return qs.filter(active=True, user=self.request.user)
def get(self, request, *args, **kwargs):
self.object = self.get_object()
return super(EditView, self).get(request, *args, **kwargs)
def post(self, request, *args, **kwargs):
self.object = self.get_object()
return super(EditView, self).post(request, *args, **kwargs)
@method_decorator(login_required)
def dispatch(self, request, *args, **kwargs):
return super(EditView, self).dispatch(request, *args, **kwargs)
class CreationEditView(EditView):
def get_queryset(self):
qs = super(EditView, self).get_queryset()
return qs.filter(active=False, user=self.request.user)
def get_success_url(self):
return reverse('create_finished',
kwargs=dict(pk=self.object.pk))
def get_context_data(self, **kwargs):
context = super(CreationEditView, self).get_context_data(**kwargs)
context['create'] = True
return context
render_page
ページは、次のように を介してレンダリングされます。
def render_page(request, element, page, context):
template_name = element_template_name(element, page)
try:
template = get_template(template_name)
except TemplateDoesNotExist:
template = get_template('template_location/%s' % page)
context = RequestContext(request, context)
return HttpResponse(template.render(context))
私のモデルが次のような場合:
class Photographer(models.Model):
name = models.CharField(max_length=20)
models = models.ManyToManyField('Model')
class Model(models.Model):
model = models.CharField(max_length=20, blank=False)
series = models.ForeignKey('Series', null=True, blank=True)
class A(models.Model):
user = models.ForeignKey(User)
photographer = models.ForeignKey('Photographer', blank=True, null=True)
model = models.ForeignKey('Model', blank=True, null=True)
Photographer
値をビュー コードに適切に統合して、後でテンプレートで使用するにはどうすればよいでしょうか? これらの値は、ユーザーが選択するドロップダウン フォームの一部になります。使用例は非常に役に立ちます。
アイデアをありがとう。
EDIT(フォームを追加)
class AForm(BaseForm):
def __init__(self, data=None, files=None, instance=None, auto_id='id_%s',
prefix=None, initial=None, error_class=ErrorList,
label_suffix=':', empty_permitted=False):
if not instance:
raise NotImplementedError("Instance must be provided")
self.instance = instance
object_data = self.instance.fields_dict()
self.declared_fields = SortedDict()
self.base_fields = fields_for_a(self.instance)
# if initial was provided, it should override the values from instance
if initial is not None:
object_data.update(initial)
BaseForm.__init__(self, data, files, auto_id, prefix, object_data,
error_class, label_suffix, empty_permitted)
cleaned_data = self.cleaned_data
# save fieldvalues for self.instance
fields = field_list(self.instance)
for field in fields:
if field.enable_wysiwyg:
value = unicode(strip(cleaned_data[field.name]))
else:
value = unicode(cleaned_data[field.name])
return self.instance