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 - 體類 –