【发布时间】:2017-05-21 01:12:32
【问题描述】:
我最近接手了一个 Python/Django 项目的开发,该项目使用 Git 作为其版本控制,以前没有使用过 Python/Django 或 Git。
将我所做的一些更改推送到服务器后,我发现虽然我所做的更改已经修复了我正在处理的错误(该错误与用户选择日期时未粘贴/保存的日期值有关在其中一个页面上的表格中),项目的另一部分以某种方式损坏(标题为“AddsOmits”的页面)......但我不确定如何,因为我没有对该部分进行任何更改。
我的修复实际损坏的部分可能来自项目的早期版本,因为我在将更改合并到 master 分支时遇到了一些错误,因此我需要检查早期的提交。所以这可能是早期提交中存在的错误。
我现在已将实时服务器上的版本恢复到我上传修复程序之前的版本 - 所以它现在处于工作状态,除了我目前正在处理的“日期”错误。
在我的本地机器上,我现在有两个分支:master,它与实时版本相同(即“日期”错误仍然存在的地方)和dateReceived(即我修复了“日期”的地方' 错误,但“AddsOmits”页面已损坏。
当我单击应该将我带到浏览器中的“AddsOmits”页面的链接时(在dateReceived 分支上,我看到一个页面,上面写着:
NoReverseMatch at costing/id/adds_omits
错误消息中的“异常值”如下:
未找到带有参数“('',)”和关键字参数“{}”的“export_csv”的反向操作。尝试了 1 种模式:[u'costing/(?P[0-9]+)/export-csv/$']
页面显示有Error during template rendering,并且:
在模板 /Users/.../costing/templates/costing/adds_omits.html 中,第 28 行出现错误 未找到带有参数 '('',)' 和关键字参数 '{}' 的 'export_csv' 的反向操作。尝试了 1 种模式:[u'costing/(?P[0-9]+)/export-csv/$']
它抱怨的模板的第 28 行是:
<a class="button m-r-md" href="{% url 'costing:export_csv' budget.id %}">Export to Excel</a>
因此,如果我理解正确的话,浏览器所抱怨的错误似乎与对视图 costing:export_csv 的调用有关,并且 URL 模式可能不匹配......?
如果我在编辑器 (Sublime) 的模板中右键单击 costing:export_csv,然后选择“转到定义”,我会转到 costing/views.py 中的 view 定义:
import csv
from django.utils.encoding import smart_str
def export_csv(request, budget_id):
budget = Budget.objects.get(id=budget_id)
items = budget.budget_items.all()
field_names = ('Build type', 'Build type detail', 'Item type client', 'Room', 'Name', 'Detail', 'Quantity', 'Unit', 'Cpu', 'Materials cost', 'Skill days', 'Labour days', 'Other unit', 'Other rate', 'Line margin', 'Total inc profit', 'Notes')
fields = ([1, 'get_build_type_display'], 'build_type_detail', 'item_type_client', [1, 'get_room_name'], 'name', 'detail', 'quantity', 'unit', 'cpu', 'materials_cost', 'skill_days', 'labour_days', 'other_unit', 'other_rate', 'line_margin', 'total_inc_profit', 'notes')
response = HttpResponse(content_type='text/csv')
response['Content-Disposition'] = 'attachment; filename=Budget-'+budget.project.project_code+'.csv'
writer = csv.writer(response, csv.excel)
response.write(u'\ufeff'.encode('utf8')) # BOM (optional...Excel needs it to open UTF-8 file properly)
writer.writerow([
smart_str(u""+field_name) for field_name in field_names
])
for obj in items:
row = []
for field in fields:
if field[0] == 1:
if hasattr(obj,field[1]): row += [smart_str(u""+plain_char(unicode(getattr(obj,field[1])() or '')))] # For methods such as get_build_type_display()
elif hasattr(obj,field): row += [smart_str(u""+plain_char(unicode(getattr(obj,field) or '')))]
writer.writerow(row)
return response
costing/views.py 中定义的用于调用 view 的 URL 模式是:
url(r'^(?P<budget_id>[0-9]+)/export-csv/$', views.export_csv, name='export_csv'),
据我所知,一切都正确匹配(定义和调用等)...
我在这里做错了什么?浏览器中错误消息中的“异常值”似乎表明我应该在某个地方传递我不是的参数,或者传递不同的参数/不传递我的参数......?
此异常的原因是什么,我该如何解决?任何帮助将不胜感激。
编辑
adds_omits 的 view 定义为:
def adds_omits(request, project_id):
project = Project.objects.select_related('variations').prefetch_related('variations__addomit_set','variations__addomit_set__item').get(id=project_id)
budget = get_current_budget(project_id)
try: v = project.variations
except ObjectDoesNotExist: v = Variations.objects.create(project=project)
adds_omits = project.variations.addomit_set.select_related('item', 'item__project_room', 'item__project_room__room').all().order_by('item__build_type', 'item__build_type_detail', 'item__project_room', 'item__order', 'item__id') #Needs id to prevent other ordering within groups
budget_items = BudgetItem.objects.select_related('addomit', 'addomit__variations', 'addomit__variations__project', 'project_room', 'project_room__room').filter(addomit__variations=v).order_by('build_type', 'build_type_detail', 'project_room', 'order', 'id') #Needs id to prevent other ordering within groups
item_formset = BudgetItemFormsetLite(queryset=budget_items, form_kwargs={"ao":True,'project':project})
ao_formset = AddOmitFormset(instance=v, queryset=adds_omits)
formsets = zip(list(item_formset.forms), list(ao_formset.forms))
for i_form in item_formset:
for field in i_form.fields:
if not field == 'id':
i_form.fields[field].widget.attrs['readonly'] = True
i_form.fields[field].widget.attrs['disabled'] = True
#Used to create new add omits
print 'Item form ini'
item_form = BudgetItemForm(project=project, template=1)
var_type_form = AoVariationTypeForm()
context = {
'project': project,
'formsets': formsets,
'ao_formset': ao_formset,
'item_formset': item_formset,
'var_type_form': var_type_form,
'item_form': item_form,
'widths': budget_item_column_widths[4:], #First column is add/delete options to allow for forloop count offset
'options_width': "5em", #First column is add/delete options to allow for forloop count offset
'widths_ao': add_omit_column_widths,
'widths_item': budget_item_column_widths, #First column is add/delete options to allow for forloop count offset
'labour_rate': labour_day_rate,
'skill_rate': skill_day_rate,
}
return render(request, 'costing/adds_omits.html', context)
【问题讨论】:
-
在将更改合并到主分支时遇到了哪些错误?问题的根源就在那里,与上面的代码无关。
-
我丢弃了合并后出现错误的
master分支,并用我在开始处理此错误之前所做的提交替换了master,所以我的master分支目前处于实时工作版本的状态。我在我的 OP 中描述的问题仅存在于dateReceived分支中 - 我想在这个分支上修复它,这样我就可以在将master推送到服务器之前将此分支与master合并。
标签: python django url-pattern