The field accessibility will show access to the fields assuming they profile has access to the object. Ensure the profile has **edit** or **create** access to the PriceBook object and at least **read** on the product since you are coming from the object pricebookentry in your class Here is an example for you: 1. Profile: PriceBook (Read) 2. Profile: Product (Read) **Apex Class** public class productTestController{ public PriceBookEntry pbe {get;set;} public Opportunity opp {get;set;} public productTestController(){ pbe = New PriceBookEntry(); opp = New Opportunity(); } } **Visualforce Page** <apex:page Controller="productTestController"> <apex:form > <apex:pageBlock > <apex:pageBlockSection > <apex:inputField value="{!Opp.AccountId}" label="Account"/> <apex:inputField value="{!pbe.Product2Id}" label="Product"/> </apex:pageBlockSection> </apex:pageBlock> </apex:form> </apex:page> **Result** [![enter image description here][1]][1] Now, Update the profile to provide **create** or **edit** (whichever you choose) access to the **Price Book** object **Result** [![enter image description here][2]][2] [1]: https://i.sstatic.net/NJqej.png [2]: https://i.sstatic.net/icfKk.png