I'm getting the error message above when trying to load my edit_transaction view. I know what the error means but don't understand why it is happening as it was working before and still works on another similar page. Can provide more code if needed, I'm wondering though if there is something blindingly obvious here, so much so that I can't see it.
Full traceback:
Traceback:
File "/Users/c/.virtualenvs/django-budget/lib/python3.5/site->packages/django/core/handlers/exception.py" in inner 42. response = get_response(request)
File "/Users/c/.virtualenvs/django-budget/lib/python3.5/site->packages/django/core/handlers/base.py" in _get_response 187. response = self.process_exception_by_middleware(e, request)
File "/Users/c/.virtualenvs/django-budget/lib/python3.5/site-packages/django/core/handlers/base.py" in _get_response 185. response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/Users/c/.virtualenvs/django-budget/lib/python3.5/site-packages/django/contrib/auth/decorators.py" in _wrapped_view 23. return view_func(request, *args, **kwargs)
File "/Users/c/sites/budget/budget/views.py" in edit_transaction 83. form = TransactionForm(instance=transaction)
Exception Type: TypeError at /budget/transaction/3/edit/ Exception Value: init() missing 1 required positional argument: 'request'
extract from urls.py:
url(r'^transaction/(?P<pk>[0-9]+)/edit/$', views.edit_transaction, name='edit_transaction'),
extract from views.py:
@login_required
def edit_transaction(request, pk):
transaction = get_object_or_404(Transaction, pk=pk)
if request.method == "POST":
form = TransactionForm(request.POST, instance=transaction)
if form.is_valid():
transaction = form.save(commit=False)
transaction.updated = timezone.now()
transaction.save()
return redirect('view_transaction_detail', pk=transaction.pk)
else:
form = TransactionForm(instance=transaction)
return render(request, 'budget/new_transaction.html', {'form': form})
template extract:
{% extends 'budget/base.html' %}
{% block content %}
<h2>{{ transaction.title }}</h2>
<h4>{{ transaction.date }}</h4>
<h4>Transaction type: {{ transaction.transaction_type }}</h4>
<h4>Category: {{ transaction.category }}</h4>
<h4>Budgeted amount: {{ transaction.budgeted_amount }}</h4>
<h4>Actual amount: {{ transaction.actual_amount }}</h4>
<h4>Difference: {{ difference }}</h4>
<h4>Comments: {{ transaction.comments }}</h4>
<a class="btn btn-default" href="{% url 'edit_transaction' pk=transaction.pk %}"><span class="glyphicon glyphicon-pencil"></span></a>
<a class="btn btn-default" href="{% url 'delete_transaction' pk=transaction.pk %}"><span class="glyphicon glyphicon-remove"></span></a>
<h5><a href="{% url 'summary' %}">Back to summary</a></h5>
{% endblock %}
Edited to add TranscationForm code
class TransactionForm(forms.ModelForm):
class Meta:
model = Transaction
fields = ('title', 'transaction_type', 'category', 'budgeted_amount', 'actual_amount', 'date', 'comments',)
#new_category field to allow you to add a new category
new_category = forms.CharField(max_length=30, required=False, label="New Category Title")
def __init__(self, request, *args, **kwargs):
super(TransactionForm, self).__init__(*args, **kwargs)
#category is now not a required field because you will use category OR new_category
self.fields['category'].required=False
#set to allow use of self.request.user to set user for category
self.request = request
def clean(self):
category = self.cleaned_data.get('category')
new_category = self.cleaned_data.get('new_category')
if not category and not new_category:
# raise an error if neither a category is selected nor a new category is entered
raise forms.ValidationError('Category or New category field is required')
elif not category:
# create category from new_category
category, created = Category.objects.get_or_create(title=new_category, defaults={'user': self.request.user})
self.cleaned_data['category'] = category
return super(TransactionForm, self).clean()
request
argument. Hi need Ruby provide that argument, both times you instantiate the form in your view. – Daniel Roseman