2016-07-05 100 views
0

我已经为我的反馈论坛类型的Web应用程序提供了一个可用的编辑表单,但我无法弄清楚如何使编辑表单中的内容出现在编辑表单中。我希望用户点击“编辑”并进入编辑反馈网址,并在表单中填写反馈信息的标题和正文。我正在使用Django,但我找不到有关如何完成此操作的任何文档。在django表单字段中显示数据库中的数据

这是我在forms.py

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

edit_feedback视图EditFeedbackForm在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}) 

而且edit_feedback.html模板

{% 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 %} 

我目前的解决办法是在显示原始帖子Ť他在页面的顶部让用户可以复制并粘贴到表单中进行更改,但显然这并不理想。

回答

1

您可以使用Django的Generic Update View来代替自己构建表单。

片段从文档:

显示用于编辑现有对象时,重新显示与验证错误形式(如果有的话),并更改保存到所述对象的形式的图。这使用从对象的模型类自动生成的表单(除非手动指定表单类)。

在上面链接的文档中甚至有一个足够的例子。

+0

我已经包含了我的编辑反馈视图,是否有一种方法可以将UpdateView合并到我有的或需要重新开始的项目中?我发现他们提供的示例过于简单 – Catherine

+0

尝试通过继承UpdateView来重写视图。忽视你已经写过的内容,并按照文档中的示例进行操作。一旦你得到这个工作,你可以尝试编写自己的自定义视图。但是对于你想要做的事情来说,“过于简单”的例子就是你所需要的。 – marcusshep

+0

@凯瑟琳我在过去一直推出自己的观点后,才开始自己使用通用视图。他们真的很有用。但是,当我阅读他们的Django源代码时,我发现我有了更好的理解 - 它很混乱,但代码非常清晰。它们很好用,因为你可以改变你的代码大部分是声明性的而不是程序性的... – rrauenza

相关问题