Solucionado (ver solução)
Solucionado
(ver solução)
11
respostas

Campo de texto com um valor fixo

Flavio, bom dia!

Na classe noticia de meu aplicativo tem um campo status da noticia, gostaria de fixar o texto "PROPOSTA" no formulario de adicionar noticia.

Para quando o usuario logado jornalista for adicionar uma noticia o campo status do formulario já vim com o valor fixo "PROPOSTA", para que ele não possa ser alterado pelo jornalista.

Obrigado!

Alysson

11 respostas

Alysson, poste seu código para que possamos analisar.

Alysson, aguardamos mais detalhes e o código para que possamos análisar e termos uma idéia melhor do que precisa implementar, ok?

Pessoal, bom dia!

Preciso implementar uma lógica para que fixe no campo status do formulário de adicionar noticia o texto "Proposta", para que o usuário logado com perfil de jornalista só possa adicionar uma noticia com este status.

classe noticia:

class Noticia(models.Model):
    titulo = models.CharField(max_length=255, null=False)
    data = models.DateField(null=False)
    hora = models.TimeField(null=False)
    conteudo = models.TextField(null=False)
    status = models.CharField(max_length=255, null=False)

pagina adicionanoticia.html

{% extends "base.html" %}
{% block body %}
   "<form action="" method="post">"
        {% csrf_token %}
        {{ form.as_p }}
        "<button type="submit">Adicionar</a></button> ou <a href="/listanoticias/">Cancelar</a>"
    "</form>"
{% endblock %}

Obrigado!

Alysson

Felipe, gostaria que o campo status nao pudesse ser alterado no formulario da funcionalidade adicionar noticia

solução!

Alysson, eu faria com o mesmo raciocínio do cap.9. Aceitando convites e exibindo nossos contatos.

No view.py criaria uma maneira dentro do método exibir para saber se o tipo do perfil é Jornalista e passaria para o render como um valor boleano:

Por exemplo:

perfil_logado = get_perfil_logado(request)
if(perfil_logado.tipo_perfil == 'Jornalista'):
    eh_jornalista = true
else:
    eh_jornalista = false

return render(request, 'perfil.html', { "perfil" : perfil, 'perfil_logado' : get_perfil_logado(request) , 'eh_jornalista' : eh_jornalista })

E no seu html:

{% if eh_jornalista %} <<passado atraves do render
    # cria o input adicionando o texto "Proporta" no input como defautl e setando ele inabilitato para         edição
    <input type="text" name="status" value="Proposta" readonly="true">
{% else %}
    # cria o input sem o value e o readonly
    <input type="text" name="status" v> 
{% endif %}

Não testei mas acho que essa é a lógica que precisa, com algumas melhorias mas principalmente é isso.

Ok Felipe, vou tentar testar está solução.

Muito obrigado!

Alysson

Blz,

Alysson, se conseguir solucionar deixe um comentário aqui para fecharmos esse tópico.

Felipe, boa tarde!

Tentei inserir o codigo que você me enviou na view, mas vou ter que estudar mais para fazer funcionar, dá uma ohada como ficou a view abaixo:

@login_required def adicionarNoticia(request): if request.method == "POST": form = FormNoticia(request.POST, request.FILES) perfil_logado = get_perfil_logado(request) if(perfil_logado.tipo_perfil == 'Jornalista'): eh_jornalista = true else: eh_jornalista = false if form.is_valid(): form.save() return render_to_response('salvo.html', {}) else: form = FormNoticia() return render_to_response('adicionanoticia.html', {'form': form,'perfil' : perfil, 'perfil_logado' : get_perfil_logado(request) , 'eh_jornalista' : eh_jornalista }, context_instance=RequestContext(request))

E a classe forms.Models que utiliza os atributos da classe model Noticia para montar o formulário é está:

class FormNoticia(forms.ModelForm): class Meta: model = Noticia

No caso teria que inserir no html abaixo assim:

{% extends "base.html" %} {% block body %} "<form action="" method="post">" {% csrf_token %} {{ form.as_p }} {% if eh_jornalista %} " <input type="text" name="status" value="Proposta" readonly="true">" {% else %} "<input type="text" name="status">" {% endif %} "<button type="submit">Adicionar</a></button> ou <a href="/listanoticias/">Cancelar</a>" "</form>" {% endblock %}

Deu para entender a indentação, estou no caminho certo.

Obrigdado!

Alysson

Felipe, alterei o código da views e deu quase certo, foi criado um campo status no formulário da pagina adicionanoticia.html, com o texto "proposta" fixo, ok!

views: @login_required def adicionarNoticia(request): if request.method == "POST": form = FormNoticia(request.POST, request.FILES) if form.is_valid(): form.save() return render_to_response('salvo.html', {}) else: form = FormNoticia() perfil_logado = get_perfil_logado(request) if(perfil_logado.cargo == 'Jornalista'): eh_jornalista = True else: eh_jornalista = False return render_to_response('adicionanoticia.html', {'form': form, 'perfil_logado' : get_perfil_logado(request) , 'eh_jornalista' : eh_jornalista }, context_instance=RequestContext(request))

Porém foi renderizado também o campo original com o campo status editável, este campo aparece porque a variável {{ form.as_p}} carrega todos os campos da tabela, como faço para não aparecer este campo?

{% extends "base.html" %} {% block body %} "<form action="" method="post">" {% csrf_token %} {{ form.as_p }} {% if eh_jornalista %} "<input type="text" name="status" value="Proposta" readonly="true">" {% else %} "<input type="text" name="status">" {% endif %} "<p><button type="submit">Adicionar</a></button> ou <a href="/listanoticias/">Cancelar</a></p>" "</form>" {% endblock %}

Obrigado!

Alysson

Blz Alysson,

O código que postei foi só um esboço da lógica que você precisava. Qualquer dúvida, estamos ai.

Posso marcar o tópico como finalizado?

Sinta-se à vontade para tirar outras dúvidas.

Abr

Felipe, deu certo!

Criei o formulario e persistiu no banco.

Pode marcar como finalizado.

Muito obrigado, você me ajudou bastante!

Alysson