2017-03-26 37 views
0

我看過關於這個錯誤的其他問題,但似乎無法找到我的問題。我知道在下面的代碼中有更好的方法可以做我想要做的一些事情,但現在我只是試圖找出導致以下錯誤的罪魁禍首。爲什麼我得到'str'對象在form_valid上沒有'get'屬性?

Internal Server Error: /users/create/ 
Traceback (most recent call last): 
    File "/home/ubuntu/workspace/venv_mymanagedservices/lib/python3.5/site-packages/django/core/handlers/exception.py", line 39, in inner 
response = get_response(request) 
File "/home/ubuntu/workspace/venv_mymanagedservices/lib/python3.5/site-packages/django/utils/deprecation.py", line 138, in __call__ 
response = self.process_response(request, response) 
File "/home/ubuntu/workspace/venv_mymanagedservices/lib/python3.5/site-packages/django/middleware/clickjacking.py", line 32, in process_response 
if response.get('X-Frame-Options') is not None: 
AttributeError: 'str' object has no attribute 'get' 
[26/Mar/2017 23:02:14] "POST /users/create/ HTTP/1.1" 500 72448 

這裏就是我想創建一個新用戶的觀點:

class CustomerUserCreate(LoginRequiredMixin, CreateView): 
model = User 
template_name = 'users/user_create.html' 
fields = ['username', 'name', 'email', 'password'] 

# Search for which customer the user is assigned to and deny access if not a customer user or superuser 
def render_to_response(self, context): 
    customer_admins = Customer.objects.filter(users=self.request.user) 
    if not (customer_admins or self.request.user.is_superuser): 
     return redirect('/403') 
    else: 
     return super(CustomerUserCreate, self).render_to_response(context) 

def get_form(self, form_class=None): 
    form = super(CustomerUserCreate,self).get_form(form_class) #instantiate using parent 
    customer_admins = Customer.objects.get(users=self.request.user) 
    # Add a field that allows user to select which companies should be added to the Company models' users field. 
    form.fields['companies'] = forms.models.ModelMultipleChoiceField(Company.objects.filter(customer=customer_admins)) 
    form.fields['companies'].widget = forms.CheckboxSelectMultiple() 
    return form 

def get_success_url(self): 
    return reverse('users:list') 

def form_valid(self, form): 
    customer_admins = Customer.objects.filter(users=self.request.user) 
    if not (customer_admins or self.request.user.is_superuser): 
     return redirect('/403') 

    companies_data = form.cleaned_data['companies'] 
    del form.cleaned_data['companies'] 
    # Record which customer account this user should be associated with 
    form.instance.created_by_customer = Customer.objects.get(users=self.request.user) 
    new_user = User.objects.create_user(username=form.cleaned_data['username'], email=form.cleaned_data['email'], name=form.cleaned_data['name'], password=form.cleaned_data['password']) 
    if companies_data: 
     for company in companies_data: 
      company.users.add(new_user) 
    else: 
     messages.add_message(self.request, messages.WARNING, 'You must select at least 1 company for the new user.') 
     return reverse('users:create') 
    # Add a success message 
    messages.add_message(self.request, messages.SUCCESS, 'User Created.') 
    return reverse('users:list') 

有沒有人有一個更清晰的頭比我做這個呢?我想我可能會把自己和所有我想要做的事完全忽略掉。

回答

0

好的,正如你可能已經注意到的那樣,我將新用戶保存在form_valid中,因爲我需要使用create_user函數,但之後我又返回了不再需要的表單。而不是返回表單,我返回new_user似乎工作。仍然不確定這是讓客戶在前端創建新用戶的最佳方式,但似乎可行。

return super(CustomerUserCreate, self).form_valid(new_user) 
相關問題