2016-03-06 87 views
1

我是Django的新手,所以这可能听起来像一个愚蠢的问题,但请耐心等待。 我已经创建了一个插入记录到我的数据库的表单,现在我正在尝试使用这个表单来更新记录。但它似乎不能正常工作。 这是我的代码。如何从Django表更新db记录

  1. 我无法弄清楚如何从HTML动态传递记录的ID。当我硬编码身份证,一切都很好。这是代码。我试过action="/task_list/update_task/{{ id }} /",它不起作用,URL中出现“/ update_task //”,导致Django引发错误信息,因为没有找到视图。理想情况下,我想通过Django的嵌入式ID,而不是模型中的ID,否则我必须在我的模型中手动包含id = models.IntegerField(primary_key=True)命令,并将其排除在似乎不是“最佳实践”的形式上,因为Django有它自己的id。
  2. 我希望Django通过所选记录的相应值自动填充文本框,但是它们被呈现为空白(因此,即使我想要更改其中一个字段,也必须填充所有文本框)。这是我的观点。

下面是代码: 网址:

url(r'^task_list/update_task/(?P<task_id>\d+)/$',task_views.updateTask), 

查看:

def updateTask(request, task_id): 
    #cur_usr_sale_point = PersonUnique.objects.filter(employees__employeeuser__auth_user = request.user.id).values_list('agreementemployees__agreement_unique__sale_point_id',flat=True) 
    selected_task = Tasks.objects.get(id=task_id)  

    if request.method == 'POST': 
     task_form = TaskForm(request.POST,instance=task_id) 
     if task_form.is_valid(): 
      task_form.save(); 
      taskTable = Tasks.objects.all() 
      return render_to_response('task_management/task_list.html',{'createTask_form':task_form, 'taskTable': taskTable},context_instance=RequestContext(request)) 
    else: 
     taskTable = Tasks.objects.all() 
     task_form = TaskForm() 
    return render_to_response('task_management/task_list.html',{'createTask_form':task_form, 'taskTable': taskTable},context_instance=RequestContext(request)) 

Django的形式

class TaskForm(forms.ModelForm): 
    def __init__(self, *args, **kwargs): 
     super(TaskForm, self).__init__(*args, **kwargs) 
     for field_name, field in self.fields.items(): 
      field.error_messages={'required': 'Придется не поленится и заполнить это поле...'} 
      field.widget.attrs['cl 

class Meta: 
     model=Tasks 
     fields = '__all__' 
     exclude=['id'] 

模板:

{% for task in taskTable %} 
    <tr> 
     <td onclick = "updateTaskWindow()"> <span style="display:block;" class="glyphicon glyphicon-pencil"></span></a> 
     </td> 
     <td>{{task.description_short}}</td> 
    </tr> 
{% endfor %} 
它应该用于更新

的引导模式窗口:

<form class="modal fade" id="updateTaskWindow" tabindex="-1" role="dialog" aria-labelledby="exampleModalLabel" action="/task_list/update_task/{{ pk }}/" method="post">{% csrf_token %} 
    <div class="modal-dialog modal-lg form-horizontal" role="form"> 
    <div class="modal-content"> 
     <div class="modal-header"> 
     <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button> 
     <h4 class="modal-title" id="exampleModalLabel">Обновить задачу</h4> 
     </div> 
     <div class="modal-body" style="font-size: smaller"> 
     {{ createTask_form.as_p }} 
     </div> 
     <div class="modal-footer">  
     <input class="btn btn-default btn-sm" type="submit" value="Обновить"/> 
     </div> 
    </div> 
    </div> 
</form> 

型号:

class Tasks(models.Model): 
    id = models.IntegerField(primary_key=True) 
    description_short = models.CharField(max_length=500) 
    description_full = models.TextField() 
    status = models.ForeignKey(TaskStatus, on_delete=models.CASCADE) 
    type = models.ForeignKey(TaskType, on_delete=models.CASCADE) 
    date_start = models.DateTimeField(blank=True, null=True) 
    date_end = models.DateTimeField(blank=True, null=True) 
    is_important = models.IntegerField(blank=True, null=True) 
    effective_from = models.DateTimeField(blank=True, null=True) 
    effective_to = models.DateTimeField() 

    class Meta: 
     managed = False 
     db_table = 'tasks' 

而且JS:

var updateTaskWindow = function() { 
    $('#updateTaskWindow').modal('show'); 
} 

我花了几个小时试图实现这个,但没有成功。请帮忙 !!!

+1

有点偏离主题 - 我肯定会推荐你检查基于类的视图,它可以节省编写已经在Django中的代码,并且你的代码将更短,更好的结构化。严重的是,看到这个 - https://docs.djangoproject.com/en/1.9/topics/class-based-views/generic-editing/ – yedpodtrzitko

回答

0

你形成有对模型的每个字段输入,阅读形式的第一个变化here

然后像做以下

if request.method == 'POST': 
    task_form = TaskForm(request.POST,instance=selected_task) 
    if task_form.is_valid(): 
     # inside your model instance add each field with the wanted value for it 
     newrecord = Tasks(name=task_form.cleaned_data['name']); 
     task_form.save(); 
+0

感谢您的回应,请你澄清一下这一点?我已经在模型中加入了这个问题。 –

+0

@EdgarNavasardyan首先阅读关于表单的更多信息,因为您的表单无法帮助,之后保存像我向您展示的数据,这是最简单的方法 https://docs.djangoproject.com/en/1.9/topics/forms/#the - 体类 –