2013-07-10 2 views
0

У меня есть следующие модели:Каков наилучший способ включения ModelForm из другой модели в шаблон?

class Picture(models.Model): 
    title = models.CharField(max_length=255) 
    (etc) 

И

class Report(models.Model): 
    complaint = models.TextField() 
    picture = models.ForeignKey('Picture') 

Что я хотел бы быть в состоянии сделать это а) Включите ModelForm отчет в «Picture» видовую шаблона б) Предположите поле изображения в отчете Modelform с соответствующим рисунком

Я уже возился с контекстными процессорами, добавлял таги и пытался передать переменную через запросы tring на новую страницу, но все они кажутся довольно сложными и не работают корректно.

Что бы я хотел получить помощь, это понимание самого «дджанго» способа сделать это, и любые указатели на это.

Решение

С помощью Скотта, рабочий раствор:

views.py

def picture(request, slug): 
    picture = Picture.objects.get(slug=str(slug)) 
    d = dict(picture=picture, form=ReportPicture()) 
    d.update(csrf(request)) 
    if request.method == 'POST': 
     form = ReportPicture(request.POST) 
      if form.is_valid(): 
      report = form.save(commit=False) 
      report.picture = picture 
      report.save() 
      return redirect(picture.get_absolute_url()) 
    return render_to_response("picture_detail.html", d) 
+0

расширить CBV 'get_context_data',' 'form_valid' и Post' методу. Это потребует немного возиться, но в конце он будет работать как шарм: D –

ответ

0

Я считаю, что вы хотели инлайн FormSets (docs).

# models.py 
class Picture(models.Model): 
    title = models.CharField(max_length=255) 

class Report(models.Model): 
    complaint = models.TextField() 
    picture = models.ForeignKey('Picture') 


# views.py 
from django.forms.models import inlineformset_factory 
from .models import Picture, Report 

def manage_picture(request, pk): 
    picture = Picture.objects.get(pk=pk) 
    ReportInlineFormSet = inlineformset_factory(Picture, Report) 

    if request.method == "POST": 
     formset = ReportInlineFormSet(request.POST, request.FILES, instance=picture) 

     if formset.is_valid(): 
      formset.save() 
      return HttpResponseRedirect(picture.get_absolute_url()) 
    else: 
     formset = ReportInlineFormSet(instance=picture) 

    return render_to_response("manage_picture.html", {"formset": formset}) 

Если вы используете класс, основанные просмотры Джанго изначально не предлагает никакой поддержки встроенного formset но есть excellent app that handles most of this for you called django-extra_views.

+0

Спасибо, это помогает. Я почти уверен, что я глуп, но мне непонятно, как я буду ссылаться на функцию «manage_picture» в представлении «Картинка» - вы можете помочь? – scaramango

+0

В приведенном выше примере 'def manage_picture' - это вид. Вы используете представления на основе классов или функций? –

+0

У меня есть представление класса для объекта Picture, но я хотел бы включить форму отчета в это представление. Я просмотрел приложение django-extra_views, но я не уверен, что это поможет? Еще раз спасибо. – scaramango

Смежные вопросы