2016-07-05 17 views
0

Ich habe eine funktionierende Bearbeitungsformular für meine Feedback-Forum-Web-App, aber ich kann nicht herausfinden, wie Sie den Inhalt eines Beitrags im Bearbeitungsformular erscheinen. Ich möchte, dass der Benutzer auf "Bearbeiten" klickt und auf die Editier-Feedback-URL gelangt und den Titel und den Text des Feedback-Posts bereits im Formular hat. Ich benutze Django, aber ich kann keine Dokumentation darüber finden, wie dies zu erreichen ist.Anzeigen von Daten aus der Datenbank in Django Formularfeld

Das ist mein EditFeedbackForm in forms.py

class EditFeedbackForm(forms.Form): 
    title = forms.CharField(label='Title') 
    body = forms.CharField(label='Body', widget=forms.Textarea) 

edit_feedback Blick in views.py

def edit_feedback(request, feedback_id, board): 
    boardObj = Board.objects.get(board_name=board) 
    boardGroups = boardObj.groups.all() 
    userGroups = request.user.groups.all() 
    userBoardAccess = False 
    boardFeedbacks = Feedback.objects.filter(feedback_board=boardObj.id) 
    userFeedbacks = Feedback.objects.filter(feedback_user=request.user.profile.id) 
    print boardFeedbacks 
    for group in boardGroups: 
     if group in userGroups: 
      userBoardAccess = True 
      break 
    if not userBoardAccess: 
     messages.error(request, 'Cannot view a board you are not a member of.') 
     return boards(request) 

    post = Feedback.objects.get(id=feedback_id) 
    form = EditFeedbackForm() 
    if post.feedback_user == request.user.profile: 
     if request.method == 'POST': 
      form = EditFeedbackForm(request.POST) 
      if form.is_valid(): 
       title = form.cleaned_data['title'] 
       body = form.cleaned_data['body'] 
       post.feedback_title = title 
       post.feedback_description = body 
       post.feedback_last_modified = datetime.now() 
       post.save(update_fields=['feedback_title', 'feedback_description', 'feedback_last_modified']) 
       print "saved feedback " + str(post.id) 
     else: 
      form = EditFeedbackForm() 
    else: 
     messages.error(request, 'Cannot edit a post you did not write.') 
     return redirect('/board/' + board + '/') 

    return render(request, 'app/edit_feedback.html', {'form': form, 'board': boardObj.board_name, 'boardid': boardObj.id, 'boardObj': boardObj, 'feedback': post, 'userFeedbacks': userFeedbacks}) 

Und die edit_feedback.html Vorlage

{% extends 'app/base.html' %} 
{% load i18n widget_tweaks %} 
{% load board_extras %} 

{% block content %} 
<div id="body-wrapper"> 
    <h1><a id="undecorated" href="/board/{{board}}">{{board}}</a></h1> 
    <!-- show current feedback --> 
    <div style="margin-left: 50px;"> 
     <h4>{{feedback.feedback_title}} | {{feedback.feedback_last_modified }}</h4> 
     <h5>{{ feedback.feedback_description }}</h5> 
    </div> 

    <!-- edit form --> 
    <form role="form" action="" method="post"> 
     {% csrf_token %} 
     {% for field in form %} 
      {% if field.errors %} 
       <div class="form-group has-error"> 
        <label class="col-sm-2 control-label" for="id_{{ field.name }}"> 
        {{ field.label }}</label> 
        <div class="col-sm-10"> 
         {{ field|attr:"class:form-control" }} 
         <span class="help-block"> 
         {% for error in field.errors %} 
          {{ error }} 
         {% endfor %} 
         </span> 
        </div> 
       </div> 
      {% else %} 
       <div class="form-group"> 
        <label class="col-sm-2 control-label" for="id_{{ field.name }}">{{ field.label }}</label> 
        <div class="col-sm-10"> 
         {{ field|attr:"class:form-control" }} 
         {% if field.help_text %} 
          <p class="help-block"><small>{{ field.help_text }}</small></p> 
         {% endif %} 
        </div> 
       </div> 
      {% endif %} 
     {% endfor %} 
     <div class="form-group"> 
      <div class="col-sm-offset-2 col-sm-10"> 
       <button type="submit" class="btn btn-primary" value="Save">{% trans "Save" %}</button><br> 
      </div> 
     </div> 
    </form> 
</div> 
{% endblock %} 

um meine aktuelle Arbeit ist die ursprüngliche Beitrag anzuzeigen an t Der obere Teil der Seite, damit ein Benutzer kopieren und in das Formular einfügen kann, um Änderungen vorzunehmen, aber offensichtlich ist das nicht ideal.

Antwort

1

Anstatt das Formular selbst zu erstellen, können Sie Djangos Generic Update View verwenden.

Schnipsel in der Dokumenten:

eine Ansicht, die für die Bearbeitung ein vorhandenes Objekt eine Form zeigt, erneutes Anzeigen des Formulars mit Validierungsfehler (wenn es welche gibt), und Änderungen an dem Objekt zu speichern. Dies verwendet ein Formular, das automatisch aus der Modellklasse des Objekts generiert wird (es sei denn, eine Formularklasse wird manuell angegeben).

Es gibt sogar ein ausreichendes Beispiel in den oben verlinkten Dokumenten.

+0

Ich habe meine Bearbeitungsfeedbackansicht hinzugefügt, gibt es eine Möglichkeit für mich, UpdateView in das zu integrieren, was ich neu starten muss oder müsste? Ich fand das von ihnen bereitgestellte Beispiel zu einfach. – Catherine

+0

Versuchen Sie, die Ansicht neu zu schreiben, indem Sie UpdateView ableiten. Ignoriere, was du bereits geschrieben hast und folge dem Beispiel in der Dokumentation. Sobald Sie das geschafft haben, können Sie versuchen, Ihre eigene benutzerdefinierte Ansicht zu schreiben. Aber für das, was Sie versuchen zu tun, ist das "übermäßig einfache" Beispiel alles was Sie brauchen. – marcusshep

+0

@Catherine Ich habe gerade angefangen, die generischen Ansichten selbst zu verwenden, nachdem ich in der Vergangenheit meine eigenen Ansichten gerollt habe. Sie sind wirklich nützlich. Ich fand, dass ich ein besseres Verständnis habe, wenn ich ihre Django-Quelle lese, obwohl - es ist ziemlich schwer, aber der Code ist ziemlich klar. Sie sind schön zu verwenden, weil Sie Ihren Code eher deklarativ als prozedural ändern können ... – rrauenza

Verwandte Themen